2016-10-20 1 views
0

J'ai des fichiers qui sont écrits dans un dossier. D'abord, il y a 2 fichiers écrits et après 10-20 minutes les 2 fichiers suivants.Dites à fileSystemWatcher d'attendre

Ma question est:

Est-il possible possible de dire au système de fichiers Watcher d'attendre jusqu'à ce que tous les 4 fichiers sont dans le dossier avant d'exécuter mon code?

+2

Créer une classe, et de créer un événement qui se déclenche lorsque les 4 entrées sont là – BugFinder

+0

Si vous connaissez le nom du dernier fichier qui sera écrit, vous pouvez utiliser la propriété Filter pour attendre uniquement les événements appartenant à ce fichier. –

Répondre

1

Selon la suggestion de @BugFinder, j'ai créé quelque chose de similaire mais je n'ai pas testé. Espoir il est utile:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace CustomFileWatcher 
{ 
    public class CustomFileWatcher : IDisposable 
    { 
     private FileSystemWatcher fileWatcher; 
     private IList<string> fileList; 
     private IList<string> createdFiles; 

     public event EventHandler FilesCreated; 
     protected void OnFilesCreated(EventArgs e) 
     { 
      var handler = FilesCreated; 
      if (handler != null) 
       handler(this, e); 
     } 

     public CustomFileWatcher(IList<string> waitForTheseFiles, string path) 
     { 
      fileList = waitForTheseFiles; 
      createdFiles = new List<string>(); 
      fileWatcher = new FileSystemWatcher(path); 
      fileWatcher.Created += fileWatcher_Created; 
     } 

     void fileWatcher_Created(object sender, FileSystemEventArgs e) 
     { 
      foreach (var item in fileList) 
      { 
       if (fileList.Contains(e.Name)) 
       { 
        if (!createdFiles.Contains(e.Name)) 
        { 
         createdFiles.Add(e.Name); 
        } 
       } 
      } 

      if (createdFiles.SequenceEqual(fileList)) 
       OnFilesCreated(new EventArgs()); 
     } 

     public CustomFileWatcher(IList<string> waitForTheseFiles, string path, string filter) 
     { 
      fileList = waitForTheseFiles; 
      createdFiles = new List<string>(); 
      fileWatcher = new FileSystemWatcher(path, filter); 
      fileWatcher.Created += fileWatcher_Created; 
     } 

     public void Dispose() 
     { 
      if (fileWatcher != null) 
       fileWatcher.Dispose(); 
     } 
    } 
} 

Utilisation

class Program 
    { 
     static void Main(string[] args) 
     { 
      IList<string> waitForAllTheseFilesToBeCopied = new List<string>(); 
      waitForAllTheseFilesToBeCopied.Add("File1.txt"); 
      waitForAllTheseFilesToBeCopied.Add("File2.txt"); 
      waitForAllTheseFilesToBeCopied.Add("File3.txt"); 

      string watchPath = @"C:\OutputFolder\"; 

      CustomFileWatcher customWatcher = new CustomFileWatcher(waitForAllTheseFilesToBeCopied, watchPath); 

      customWatcher.FilesCreated += customWatcher_FilesCreated; 
     } 

     static void customWatcher_FilesCreated(object sender, EventArgs e) 
     { 
      // All files created. 
     } 
    }