[C#] FileSystemWatcher et son buffer

FileSystemWatcher et son buffer [C#] - C#/.NET managed - Programmation

Marsh Posté le 27-02-2007 à 16:46:07    

Salut à tous,
 
J'ai un gros souci avec le FilesystemWatcher, pouvez-vous m'aider ?
 
Mon soft scan un répertoire pour faire un traitement sur chaque nouveau fichier créé qu'il déplace dans un répertoire de backup une fois le traitement fini.
Le FileSystemWatcher(FSW) stocke en mémoire tous les fichiers nouvellement créés et appel ma fonction au fur et à mesure.
 
Disons qu'il stock dans un tableau les nouveaux fichiers {file1, file2, file3, ...}
le FSW appelle ma fonction en lui donnant file1, attends la fin du traitement, appelle ma fonction avec file2....etc.
 
Le problème, c'est que parfois mon traitement a besoin de 2 fichiers et vas les déplacer en même temps.
C'est là qu'est le problème, car si je déplace un fichier présent dans la liste du FSW avant que celui-ci ne me l'ait donné, il plante mon programme à ce moment-là.
 
Plus concrètement
-> 3 nouveaux fichiers sont crées  
-> le FSW stocke le nom des 3 fichiers {file1, file2, file3}
-> le FSW -> ma_fonction( file1 )
-> je traite file1, j'ai besoin de file2, file2 existe donc je fais mon traitement et déplace file1 et file2
-> le FSW plante car il veut me donner file2 mais ce fichier n'existe plus.
 
Comment faire pour lui dier de passer à file3 si file2 n'existe pas ?

Reply

Marsh Posté le 27-02-2007 à 16:46:07   

Reply

Marsh Posté le 01-03-2007 à 15:28:50    

Personne ne sait si on peut controler le FSW ? Ou comment accéder à son buffer ?

Reply

Marsh Posté le 01-03-2007 à 18:07:06    

Il te suffit de ne pas deplacer file2 quand tu traites file1

Reply

Marsh Posté le 02-03-2007 à 15:16:11    

Merci pour cette réponse pleine de bon sens...
 
Je ne peux pas faire autrement.
 
D'autres idées ?

Reply

Marsh Posté le 02-03-2007 à 15:47:44    

(par exemple)
 

Code :
  1. using System;
  2. using System.IO;
  3. using System.Windows.Forms;
  4. namespace TestFSW
  5. {
  6.     public partial class Form1 : Form
  7.     {
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.             fileSystemWatcher1.BeginInit();
  12.             fileSystemWatcher1.Path = @"c:\in";
  13.             fileSystemWatcher1.EndInit();
  14.         }
  15.         private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
  16.         {
  17.             FileInfo f = new FileInfo(e.FullPath);
  18.             if (f.Extension != ".param" )
  19.                 TraiteFichier(e.FullPath);
  20.         }
  21.         public void TraiteFichier(string file)
  22.         {
  23.             if (File.Exists(file))
  24.             {
  25.                 listBox1.Items.Add(file);
  26.                 // Simulation du traîtement de plusieurs fichier
  27.                 FileInfo f = new FileInfo(file);
  28.                 foreach (string fi in Directory.GetFiles(f.DirectoryName, f.Name + "*" ))
  29.                 {
  30.                     File.Delete(fi);
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }


Message édité par MagicBuzz le 02-03-2007 à 15:48:18
Reply

Marsh Posté le 02-03-2007 à 15:55:50    

T'ain, effectivement, je comprends ton problème : File.Delete() (.Move() aussi certainement) est assynchrone. Du coup tu dis que les effacter, mais le File.Exists() les détecte encore ! Trop de la balle :D

Reply

Marsh Posté le 02-03-2007 à 15:58:18    

C'est gore, mais ça marche :ange:
 

Code :
  1. using System;
  2. using System.IO;
  3. using System.Threading;
  4. using System.Windows.Forms;
  5. namespace TestFSW
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         bool plop = true;
  10.         public Form1()
  11.         {
  12.             InitializeComponent();
  13.             fileSystemWatcher1.BeginInit();
  14.             fileSystemWatcher1.Path = @"c:\in";
  15.             fileSystemWatcher1.EndInit();
  16.         }
  17.         private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
  18.         {
  19.             FileInfo f = new FileInfo(e.FullPath);
  20.             if (f.Extension != ".param" )
  21.                 TraiteFichier(e.FullPath);
  22.         }
  23.         public void TraiteFichier(string file)
  24.         {
  25.             Thread.Sleep(100);
  26.             while (!this.plop) { }
  27.             this.plop = false;
  28.             if (File.Exists(file))
  29.             {
  30.                 listBox1.Items.Add(file);
  31.                 // Simulation du traîtement de plusieurs fichier
  32.                 FileInfo f = new FileInfo(file);
  33.                 foreach (string fi in Directory.GetFiles(f.DirectoryName, f.Name + "*" ))
  34.                 {
  35.                     File.Delete(fi);
  36.                 }
  37.             }
  38.             this.plop = true;
  39.         }
  40.     }
  41. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed