Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3167 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] FileSystemWatcher et son buffer

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] FileSystemWatcher et son buffer

n°1521092
docwario
Alea jacta est
Posté le 27-02-2007 à 16:46:07  profilanswer
 

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 ?

mood
Publicité
Posté le 27-02-2007 à 16:46:07  profilanswer
 

n°1522337
docwario
Alea jacta est
Posté le 01-03-2007 à 15:28:50  profilanswer
 

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

n°1522449
breizhbugs
Posté le 01-03-2007 à 18:07:06  profilanswer
 

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

n°1522899
docwario
Alea jacta est
Posté le 02-03-2007 à 15:16:11  profilanswer
 

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

n°1522917
MagicBuzz
Posté le 02-03-2007 à 15:47:44  profilanswer
 

(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
n°1522924
MagicBuzz
Posté le 02-03-2007 à 15:55:50  profilanswer
 

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

n°1522926
MagicBuzz
Posté le 02-03-2007 à 15:58:18  profilanswer
 

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. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] FileSystemWatcher et son buffer

 

Sujets relatifs
[C#] [Résolu] Comment communiquer avec une dll c++Taille de buffer? [Résolu]
[C] Des accolades "just pour le fun" ?[ socket ] Récupérer un autre Buffer de la fonction recv()
[C] comment détecter les caractères BOM dans buffer char* ?Convertir un buffer recu par socket pour afficher un entier
Affichage étrange de données hexa contenues dans un buffer [Résolu]buffer
Pgsql: vacuumdb Erreur buffer xxx is not ownedouvrir une vidéo dans un buffer
Plus de sujets relatifs à : [C#] FileSystemWatcher et son buffer


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)