Précédent   Forum du club des développeurs et IT Pro > Dotnet > Développement Windows > Services Windows
Services Windows Forum d'entraide sur le développement de services Windows.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/11/2012, 20h32   #1
VITALTH
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : mars 2008
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2008
Messages : 175
Points : 66
Points : 66
Par défaut Probleme de conflit de fichier

Bonjour,
J'ai créé un service Windows contenant un FileSystemWatcher.

Celui ci instancie la délégation OnCreated avec une classe qui contient un certain nombre de chose. Dans cette classe, on copie le fichier vers un autre fichier et on exploite le fichier copier (ça fait beaucoup de chose je ne vais pas rentrer dans le détail).
A la fin de la méthode OnCreated, on supprime le fichier.

Sur Erreur, je m'envois un mail avec le détail de l'erreur et le fichier est supprimé. S'il n'y a pas d'erreur, un document est imprimé et le fichier est supprimé également.


Quand je lance le service et que je met un fichier dans le répertoire écouté par le FileSystemWatcher tout va bien et le document est imprimé et le fichier supprimé. Quand je met un deuxième fichier, une erreur se produit et dans mon mail le détail me dit que le Processus ne peut accéder au fichier "leFichierDonne" car il est utilisé par un autre processus.

Dans la classe qui s'occupe du travail, je ne vais pas dire que je ne lis pas un fichier, mais ce n'est pas le même. La seule chose qu'on fait c'est une copie et une supression à la fin sur ce fichier.

Avez vous une idée de ce qui pourrait bien se passer car là je suis dans la panade....



Un bout de code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
 
public class FSWatcher
{
   public static void watch()
   {
        FileSystemWatcher wtch = new FileSystemWatcher();
        wtch.Path = "MonRepertoire"
        wtch.Filter = "*.txt"
        wtch.Created = new FileSystemEventHandler(OnCreated);
        wtch.EnableRaisingEvents = true;
   }
 
   private void OnCreated(object source, FileSystemEventArgs e)
   {
       Action a = new Action(e.FullPath);
       File.Delete(e.FullPath);
       a = null;
   }
}
publc class Action
{
      public Action(string fileInput)
      {
           Traitement(fileInput);
      }
 
      private void Traitement(string fileInput)
      {
          File.Copy(fileInput,fileSauvegarde,true);
          /* Ici on fait bcp de choses avec fileSauvegarde, notamment de la lecture, on ouvre, imprime, sauvegarde, convertir en PDF des fichiers excel
On fait des FTP */
      }
 
}
 
 
public MonService : ServiceBase
{
    public MonService()
    {
        ServiceInstaller si = new ServiceInstaller();
        si.StartType = ServiceStartMode.Manual;
        si.DisplayName = "mon service";
        si.Description = "Service écoute répertoire";
        si.ServiceName = "FolderWatcher";
        InitializeComponent();
 
    }
 
    protected override void OnStart(string[] args)
    {
        FSWatcher.watch();
    }
     protected override void OnShutdown()
     {
     }
 
     protected override void OnPause()
     {
     }
 
      protected override void OnContinue()
     {
     }
      protected override void OnShutdown()
      {
      }
 
      protected override void OnPause()
      {
      }
 
      protected override void OnStop()
      {
      }
 
 
}

Petite précision, pour le tester, j'ai mis ma class FSWatcher dans un form et au load du form j'ai écrit l'instruction Et ben en interactif, je n'ai aucun problème. C'est juste en mode Service que le bug apparait.
VITALTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2012, 15h35   #2
VITALTH
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : mars 2008
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2008
Messages : 175
Points : 66
Points : 66
J'ai trouvé une solution temporaire qui ne me convient pas du tout : si quelqu'un a mieux je suis preneur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
 
   private void OnCreated(object source, FileSystemEventArgs e)
   {
       string fileInput = e.FullPath;
       int compteur = 0;
       bool retry = true;
       While (retry && compteur <= 10000)
       {
          Try
          {
             File.Copy(fileInput, fileSauvegarde, true);
             retry = false;
          }
          Catch(Exception)
          {
             retry = true;
             compteur++;
          }
       }
       if (compteur >= 10000)
       {
           Exception ex = new Exception(string.Format(" Impossible d'accéder au fichier {0}", fileInput);
           GererErreur(ex);
       }
       Action a = new Action(fileSauvegarde);
       File.Delete(e.FullPath);
       a = null;
   }
Apparemment en febug, le compteur s'arrête à deuxième passage, comme si le Try/Catch libère toutes les ressources.
Bien entendu dans la class Action, je ne gère pas la copie
VITALTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2012, 19h33   #3
sisqo60
Membre Expert
 
Avatar de sisqo60
 
Homme
Consultant informatique
Inscription : février 2006
Messages : 731
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : février 2006
Messages : 731
Points : 1 150
Points : 1 150
Bonjour,

le problème ressemble beaucoup à un stream non fermé, mais le code que tu nous a fourni ne permet pas de confirmer mon intuition.

Tu sais ce qu'il te reste à faire...
__________________
Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

N'oubliez pas de avant de
Pas de question techniques par MP, c'est contre la philosophie du forum
sisqo60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2012, 10h48   #4
VITALTH
Membre du Club
 
Homme
Ingénieur développement logiciels
Inscription : mars 2008
Messages : 175
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2008
Messages : 175
Points : 66
Points : 66
Tout à fait d'accord !!!
Ceci dit ce qui est surprenant c'est que l'erreur se trouve sur le fichier que j'ai appelé "fileInput" alors que le fichier qui est lu dans le programme est le fichier "fileSauvegarde"

Je vais tout de même fournir le code de lecture pour bien montrer que ça ne vient pas de là

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
public Class Action()
{
     private string _fileInput;
     private DataTable _dt;
     private DataIO _dataIO;
 
     public Action(string fileInput)
     {
         _fileInput = fileInput;
        traitement();
     }
 
     private void traitement()
     {  
         //Un certain nombre de chose
         lireFichier();
         // D'autre trucs
     }
 
 
     private void lireFichier()
     {
          _dt = _dataIO.Lire(_fileInput);
     }
 
}
 
public Class DataIO()
{
 
    private StremReader _lecture;
    private FileStream _flux;
 
    public DataTable Lire(string fileInput)
    {
        DataTable dt = new DataTable();
        openFileRead(chemin);
        _lecture = new StreamReader(_flux);
        int ligne = 0;
        while (_lecture.Peek() != -1)
        {
            DataRow dr = dt.NewRow();
            string l = _lecture.ReadLine();
            string[] chps = l.Split(';');
            //Evidemment le séparateur de champs est le ; mais vous l'aurez compris
            for (int i = 0; i < chps.Length; i++)
            {
                if (ligne == 0)
                {
                    DataColumn dc = new DataColumn();
                    dc.Columns.Add(dc);
                }
                dt.Rows.Add(dr);
                ligne++;
            }
            closeReadFile();
            return dt;
        }
    }
 
 
    private void openFileRead(string path)
    {
         _flux = File.Open(_chemin, FileMode.Append);   
    }
 
    private void closeFileRead()
    {
        _lecture.Close();
        _flux.Close();
    }
}
VITALTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h00.


 
 
 
 
Partenaires

Hébergement Web