+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre habitué
    Homme Profil pro Vital Thyot
    Ingénieur développement logiciels
    Inscrit en
    mars 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Nom : Homme Vital Thyot
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : mars 2008
    Messages : 310
    Points : 120
    Points
    120

    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.

  2. #2
    Membre habitué
    Homme Profil pro Vital Thyot
    Ingénieur développement logiciels
    Inscrit en
    mars 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Nom : Homme Vital Thyot
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : mars 2008
    Messages : 310
    Points : 120
    Points
    120

    Par défaut

    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

  3. #3
    Modérateur
    Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    février 2006
    Messages
    754
    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 : 754
    Points : 1 174
    Points
    1 174

    Par défaut

    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

  4. #4
    Membre habitué
    Homme Profil pro Vital Thyot
    Ingénieur développement logiciels
    Inscrit en
    mars 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Nom : Homme Vital Thyot
    Âge : 31
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : mars 2008
    Messages : 310
    Points : 120
    Points
    120

    Par défaut

    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();
        }
    }

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •