2009-08-20 8 views
0

J'utilise FileSystemWatcher pour notifier quand les nouveaux fichiers sont créés dans le répertoire réseau. Nous traitons les fichiers texte (environ 5 Ko de taille) et les supprimons immédiatement lorsque le nouveau fichier est créé dans le répertoire. Si le service de fenêtres FileSystemWatcher s'arrête pour une raison quelconque, nous devons rechercher les fichiers non traités après leur redémarrage. Comment puis-je gérer si le nouveau fichier vient pendant le traitement des anciens fichiers du répertoire? Des exemples s'il vous plaît?FileSystemWatcher et fichiers non traités

Merci,

Voici l'exemple de code que j'ai avec la forme simple.

public partial class Form1 : Form 
{ 
    private System.IO.FileSystemWatcher watcher; 
    string tempDirectory = @"C:\test\"; 
    public Form1() 
    { 
     InitializeComponent(); 
     CreateWatcher(); 
     GetUnprocessedFiles(); 
    } 
private void CreateWatcher() 
{ 
    //Create a new FileSystemWatcher. 
    watcher = new FileSystemWatcher(); 
    watcher.Filter = "*.txt"; 
    watcher.NotifyFilter = NotifyFilters.FileName; 
     //Subscribe to the Created event. 
    watcher.Created += new FileSystemEventHandler(watcher_FileCreated); 
    watcher.Path = @"C:\test\"; 
    watcher.EnableRaisingEvents = true; 
} 

void watcher_FileCreated(object sender, FileSystemEventArgs e) 
{ 
    //Parse text file. 
     FileInfo objFileInfo = new FileInfo(e.FullPath); 
     if (!objFileInfo.Exists) return; 
     ParseMessage(e.FullPath); 
} 


    void ParseMessage(string filePath) 
    { 
     // Parse text file here 
    } 

    void GetUnprocessedFiles() 
    { 
     // Put all txt files into array. 
    string[] array1 = Directory.GetFiles(@"C:\test\"); 
    foreach (string name in array1) 
    { 
     string path = string.Format("{0}{1}", tempDirectory, name) 
     ParseMessage(path); 
    } 
    } 

}

Répondre

0

Lorsque le début du processus procédez comme suit:

  • d'abord obtenir le contenu du dossier
  • processus
  • chaque fichier (fin les supprimer comme vous le faites déjà maintenant)
  • répétez jusqu'à ce qu'aucun fichier ne se trouve dans le dossier (vérifiez de nouveau ici, car un nouveau fichier aurait pu être placé dans le dossier).
  • commencer le veilleur
+0

Merci pour la réponse. J'y ai pensé. –

+0

Bien que peu probable, ce n'est pas une bonne solution. Un fichier pourrait être créé entre votre dernière vérification des fichiers et l'observateur en cours d'initialisation. – johnw182

0

Pour un de nos services qui utilisent le FileSystemWatcher nous traitons toujours tous les fichiers qui existent dans le répertoire premier, avant de commencer le veilleur. Après le démarrage de l'observateur, nous démarrons une minuterie (avec un intervalle assez long) pour gérer tous les fichiers qui apparaissent dans le répertoire sans déclencher l'observateur (cela arrive de temps en temps). Cela couvre généralement toutes les possibilités.

Questions connexes