Bonjour à tous, j'ai un pb en c# (.NET 2.0) que je n'arrive pas à résoudre.
Si quelqu'un avait une idée pour m'aider, ce serait sympa :
une application cliente, que je ne peux donc pas modifier, ajoute et supprime des fichiers dans un répertoire donné. Je dois, de mon côté, détecter ces ajouts et suppressions de manière fiable SANS verrouiller les fichiers au cas où le client voudrait en supprimer un.
Sur le principe, pas de pb. J'ai utilisé FileSystemWatcher, cela marche très bien. Là, où ca coince, c'est que FileSystemWatcher avertit dès le début de la copie du fichier et que je peux avoir des fichiers de 10 ko comme de 500 Mo.
Comment être averti que le fichier est fini de copier ?
L'astuce que j'ai trouvé est : dès que j'ai l'événement fichier_crée, j'essaie dans un while d'ouvrir un flux FileStream sur ce fichier. Tant que j'ai une erreur, je boucle. Quand je peux ouvrir mon flux, c'est que le fichier est fini de copier. Je ferme le flux pour ne pas le verrouiller.
Code : quand recu événement fichier_crée :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 bool finiCopie = false; while (!finiCopie) { try { FileStream fs = new FileStream(nomCompletFichier, FileMode.Open); fs.Close(); finiCopie = true; } catch (Exception e) {} } } // Je sors de la boucle donc ici, je sais que le fichier est fini de copier.
D'après vous, n'y a t-il pas un risque :
- que je verrouille le fichier pendant le laps de temps que mon flux FileStream s'ouvre ?
- que mon fichier soit supprimé entre temps et boucle sans fin ? -> je pensais dans ce cas créer un tableau string[] present : quand l'événement fichier_crée arrive, j'ajoute le nom du fichier dans present[] et modifier mon while par while (!finiCopie && nom du fichier trouvé dans present[]).
Sinon, j'ai essayé FileInfo.length, les dll natives avec kernel32.dll, j'ai toujours la taille totale du fichier même quand la copie du fichier n'est qu'au début.
Avez-vous une idée, svp ?
Faut-il que je passe en c++ plutot avec de l'asm ?
Merci d'avance.
Partager