Bonjour à tous et toutes, je voudrais avoir votre avis sur le problème suivant:
J'ai une application que j'ai développé, qui concrètement ouvre un fichier texte déposé dans un répertoire et bricole avec (elle le le parcours en lecture puis le déplace notamment ).
Bon le problème qui se pose est le suivant:
dans le répertoire monitoré, les fichiers sont déposé via FTP.
Si dans mes tests je n'ai jamais eu de problème de concurence d'accès, ni en test réel avec mon collègue, durant la démo bien sûr ça c'est planté à chaque fois!
Je suis sûr que le problème est bien une concurence d'accès car:
Je lance le transfert ftp, le fichier est bien présent au bou mais mon application est crachée avec un message d'erreur de windows.
Si je la relance, lors du lancement elle traite tout ce qui est présent dans le répertoire, donc elle va traiter le fichier qui est présent et ne se crashera pas cette fois là. Preuve que c'est bien un accès durant le transfert du fichier via ftp qui le crash.
Bref en gros d'après mes tests et comment ça se passe, je suis sur que c'est une concurence d'accès au fichier. (j'essaye de le lire et donc de stocker dans mes variables alors que le transfert n'est pas fini).
Ma question c'est comment tester donc que le fichier est bien disponible pour moi, donc qu'il est complet, en sachant que je réagis sur dépot de fichier dans le répertoire (réaction à l'évènement système de création de nouveau fichier dans ce répertoire).
Un sleep n'est absolument pas possible car si la taille du fichier change ça sera le même problème, bref idéalement il faut que je boucle tant que le fichier n'est pas dispo pour moi,
Est ce qu'un transfert ftp est exclusif sur le fichier? Je suppose que oui, Et du coup comment savoir si le fichier est accessible en readonly? (en gros il faut que je boucle tant que le fichier n'est accessible qu'en readonly, dès qu'il est dispo en full droit alors c'est que le transfert est fini je suppose?)
C'est dans FileAcces ou FileAttribute? et mon idée est elle bonne?
en gros ça:
Code :
- Thread.Sleep(500);
- FileAttributes Fa = File.GetAttributes(fic);
- // Vérification si le fichier est en lecture seule
- while (Fa == FileAttributes.ReadOnly)
- {
- Thread.Sleep(500);
- Fa = File.GetAttributes(fic);
- }
|
Mais je ne sais pas si ici les attributs du fichiers c'est ce que je vais avoir en ouverture, ou juste les droits utilisateurs sur le fichier...
Merci d'avance.
Message édité par burn2 le 26-03-2009 à 17:11:25
---------------
"C'est vrai qu'un type aussi pénible de jour on serait en droit d'espérer qu'il fasse un break de nuit mais bon …"