2013-03-04 5 views
1

J'ai un chemin d'accès au serveur tel que \\10.100.100.10000\Builds. Chaque fois que quelqu'un tire une force construite dans notre serveur dans Visual Studio, un nouveau dossier de construction, comme 2013.1.3.1, est créé et de nouveaux fichiers y sont copiés. Je dois écrire un Windows Service ainsi quand le dossier est copié complètement, je dois extraire Application.exe et faire un peu de traitement.Service de fenêtre lorsque la copie de dossier est terminée

Ma question est de savoir si le dossier a été copié complètement? Googling et Binging ne m'a pas beaucoup aidé. Dois-je dire à mon équipe qui déclenche l'événement de construction de faire un travail personnalisé pour que mon programme sache que les fichiers de copie sont terminés? Ou y at-il des bibliothèques .Net pour accomplir cette tâche?

+1

Que diriez-vous de vérifier la taille du répertoire et - si elle ne devient pas plus grande - en supposant que le processus de copie a réussi? – Matten

+0

Lors de la création d'un ID de solution, de nouveaux fichiers sont ajoutés et les fichiers actuels sont modifiés. Certes, la taille de construction ne sera jamais la même. Cette idée ne sera pas appropriée. – Sandy

+1

Dans ce cas, observez ce dossier et si la taille ne change plus après un délai, effectuez votre action personnalisée depuis la fin de la construction ou définissez un événement de génération de poste pour appeler votre application. – Matten

Répondre

1

C'est ainsi que je l'ai fait à la fin pour voir si une copie de dossier a été terminée. Créez un System.IO.FileSystemWatcher et attribuez un événement à la propriété Created.

private void FileSystemWatcherCreated(object sender, FileSystemEventArgs e) 
{ 
    long sizeOld = GetDirectorySize(new DirectoryInfo(e.FullPath)); 

    Thread.Sleep(100000); 

    long sizeNew = GetDirectorySize(new DirectoryInfo(e.FullPath)); 

    if (sizeOld == sizeNew) 
    { 
     // Copying finished. 
    } 
} 

La méthode ci-dessus vérifie simplement la taille du dossier toutes les minutes, puis compare les tailles. Si les tailles sont identiques, déclare que le dossier de copie est terminé.

Espérons que ça aide.

1

Vous pouvez utiliser un FileSystemWatcher pour surveiller l'activité dans le dossier, la surveillance peut être démarrée au démarrage du service Windows (dans Start Method).

Vous pourriez avoir les gestionnaires d'événements suivants inscrits au Filewatcher

FSWatcher.Deleted + = new System.IO.FileSystemEventHandler (this.FSWatcher_Deleted); FSWatcher.Renamed + = new System.IO.RenamedEventHandler (this.FSWatcher_Renamed); FSWatcher.Changed + = new System.IO.FileSystemEventHandler (this.FSWatcher_Changed); FSWatcher.Created + = new System.IO.FileSystemEventHandler (this.FSWatcher_Created);

L'événement FSWatcher_Changed sera maintenu allumé jusqu'à la fin du processus de copie.

Vous pouvez utiliser cet événement pour savoir quand la copie a commencé et attendre que le processus de copie se termine. Une fois le processus de copie terminé, je veux dire quand le dossier est silencieux, vous pouvez commencer à faire l'extraction de Application.Exe ou d'autres tâches que vous souhaitez faire.

Espérons que ça aide.

+0

Tout ce que vous avez dit était connu de moi. Je demande juste comment savoir si le processus de copie est fini? Je veux dire que la copie peut également se produire à partir d'un serveur différent via Remote. – Sandy

+0

Supposons que l'événement Changed soit déclenché. Vous démarrez une minuterie avec disons 60 secondes. Si l'événement modifié n'a pas été renvoyé dans les 60 secondes, vous pouvez supposer que le processus de copie est terminé et commencer à travailler. S'il est à nouveau déclenché, réinitialisez la minuterie.Si vous avez accès au dossier source, vous pouvez également effectuer une vérification en comparant les dossiers source et cible une fois la copie terminée. –

+0

Tant que FileSystemWatcher est configuré pour regarder le dossier et que le compte dispose des autorisations suffisantes, l'événement est déclenché, que les fichiers soient copiés par une application locale ou distante. Je l'ai implémenté dans un environnement de production et je n'avais aucun problème jusqu'à présent. –

Questions connexes