2009-02-03 6 views
3

Existe-t-il une méthode intégrée pour attendre la création d'un fichier en C#? Que diriez-vous d'attendre qu'un fichier soit complètement écrit?En attente de création d'un fichier en C#

J'ai cuit mon propre en essayant à plusieurs reprises File.OpenRead() sur un fichier jusqu'à ce qu'il réussisse (et à défaut sur un délai d'attente), mais tournant sur un fichier ne semble pas la bonne chose à faire. Je devine qu'il y a une méthode intégrée dans .NET pour faire ceci, mais je ne peux pas le trouver.

Répondre

10

Qu'en est-il de l'utilisation du composant FileSystemWatcher?

Cette classe «surveille» un répertoire ou un fichier donné, et peut déclencher des événements lorsque quelque chose (vous pouvez définir quoi) est arrivé.

+1

Juste une mise en garde FileSystemWatcher - j'ai trouvé qu'un FileSystemWatcher peut échouer lors d'une tentative de l'utiliser avec un lecteur monté sur le réseau où la connexion est squameuse. Essentiellement, lorsque la connexion était perdue et rétablie, l'observateur ne reconnaissait plus les changements. Juste mes deux cents. – itsmatt

+0

Il ne fonctionne pas non plus avec Novell Networks au moins 1.1 n'a pas – JoshBerke

1

FileSystemWatcherFileSystemWatcher peut vous informer lorsqu'un fichier est créé, supprimé, mis à jour, les attributs modifiés, etc. Il résoudra votre premier numéro d'attente pour qu'il soit créé. Comme pour l'attente de l'écriture, quand un fichier est créé, vous pouvez essaimer et commencer à suivre sa taille et attendre qu'il cesse d'être mis à jour, puis ajouter dans une période de temps de règlement, vous pouvez également essayer et obtenir un verrou exclusif mais faites attention à verrouiller le fichier si l'autre processus essaye aussi de le verrouiller ... vous pourriez provoquer des signes inattendus. FileSysWatcher ne peut pas surveiller les chemins d'accès réseau.

1

Dans de tels cas, vous devez manuellement "explorer" les fichiers dans un répertoire - ce qui peut entraîner l'erreur ci-dessus des utilisateurs.

Y at-il une alternative, de sorte que nous puissions être sûrs que nous n'ouvrons pas un fichier avant qu'il ait été entièrement écrit sur le disque et fermé?

+0

La méthode "dumb mais works" que j'ai utilisée (à travers les chemins réseau) consiste à mettre un thread.sleep() dans une boucle qui surveille la taille. Vérifiez le fichier. S'il n'existe pas alors dormez de toute façon, s'il existe, vérifiez la taille et dormez une fois de plus. Si la prochaine fois la taille est la même, alors quittez, sinon, dormez à nouveau. Je regarde des fichiers de 15-20Mb et je dors pendant 5 minutes entre les deux ... ce qui est exagéré mais comme c'est du jour au lendemain, cela n'a aucun impact. Ce n'est pas très intelligent, mais n'a pas encore échoué. – BlueChippy

3

Lors de la création d'un fichier avec File.Create, vous pouvez simplement appeler la fonction Close. Comme ceci:

File.Create(savePath).Close();