Je rencontre un problème avec un FileSystemWatcher lorsque plusieurs fichiers sont placés dans le répertoire surveillé. Je veux analyser le fichier dès qu'il est placé dans le répertoire. En général, le premier fichier est bien analysé, mais l'ajout d'un deuxième fichier au répertoire pose un problème d'accès. Parfois, le premier fichier n'est même pas analysé. Une seule application est en cours d'exécution et surveille ce répertoire. À terme, ce processus sera exécuté sur plusieurs machines qui surveilleront un répertoire partagé, mais un seul serveur pourra analyser chaque fichier, car les données sont importées dans une base de données et il n'y a pas de clés primaires.
Voici le code du FileSystemWatcher :
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Puis la méthode qui analyse le fichier :
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
En déplaçant le deuxième fichier, on attrape
System.IO.IOException : Le processus ne peut pas accéder au fichier ' C:\Temp\TestFile.txt car il est utilisé par un autre processus.
Je m'attendrais à voir cette erreur si le programme était exécuté sur plusieurs machines, mais il n'est exécuté que sur un seul serveur pour le moment. Il ne devrait pas y avoir d'autre processus utilisant ce fichier - je les ai créés et je les copie dans le répertoire lorsque l'application fonctionne.
Est-ce la bonne façon de configurer le FileSystemWatcher ? Comment puis-je voir ce qui a le verrou sur ce fichier ? Pourquoi les deux fichiers ne sont-ils pas analysés ? Dois-je fermer le FileStream ? Je souhaite conserver l'option FileShare.None car je veux qu'un seul serveur analyse le fichier - le serveur qui accède au fichier l'analyse en premier.