2008-11-17 2 views
2

Est-ce la meilleure façon de gérer le déplacement de fichiers dans un service Windows? nous avons de nombreux fichiers qui sont appariés et déplacés, mais un utilisateur final peut avoir le fichier ouvert au moment du déplacement.Gestion d'un fichier ouvert lors de l'exécution de File.Move()

C'est ce que le code dit actuellement:

Do While IO.File.Exists(OriginalFilePath) 

    Try 
     IO.File.Move(OriginalFilePath, BestMatchPath) 
    Catch ex As IO.IOException 
     Log(TraceLevel.Warning, "The file '{0}' was unable to be moved (probably opened by someone)", OriginalFilePath) 
     Threading.Thread.Sleep(1000) 
    End Try 

Loop 

Y at-il une meilleure façon de gérer cela? J'ai pensé à l'enfiler pour permettre au processus de continuer, mais actuellement je ne suis pas sûr que ce soit viable, car le reste du processus pourrait avoir besoin du chemin des fichiers pour être précis.

Répondre

2

Comme il s'agit d'un service Windows, et en fonction du nombre de fichiers que vous essayez de déplacer simultanément, j'utiliserais un thread d'arrière-plan pour chaque déplacement de fichier. Si vous utilisez le type BackgroundWorker, vous pouvez remonter toute exception vers le thread principal, puis attendre X minutes avant de réessayer de déplacer le fichier.

Normalement, je ne préconiserais pas une solution multithread, mais dans ce cas, il n'y a pas d'état partagé entre les threads, il est donc beaucoup plus facile de contrôler les problèmes de threads. Pour effectuer une autre tâche qui dépend de la réussite de tous les déplacements de fichiers, vous pouvez vous connecter aux threads d'arrière-plan pour être au courant quand ils ont tous terminé.

2

Une suggestion: dans la méthode de service Start(), activer un System.Timers.Timer pour exécuter périodiquement votre fichier boucle en mouvement, sans l'appel Sleep(1000). De cette façon, un fichier qui n'a pas été déplacé dans l'exécution en cours ne bloquera pas le déplacement d'autres fichiers (déverrouillés). Les fichiers problématiques auront une chance d'être déplacés lors d'essais ultérieurs. Réglez l'intervalle de la minuterie pour répondre à vos besoins. @Andy a pensé à fileter - un Timer est un moyen efficace de traiter le filetage. Un processus de service est un endroit approprié pour l'exécution répétée de sections de code. Notez que la boucle sans Sleep(1000) ne bloquera pas.

+0

Je ne crois pas qu'un fil de discussion bloquera tout autre processus. – kenny

+0

Je ne pense pas que ce soit ce qu'il voulait dire. Comme implémenté, si un fichier est verrouillé, le service se bloquera complètement (lui-même) et ne traitera aucun autre fichier. – GalacticCowboy