IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Windows Discussion :

Probleme de conflit de fichier


Sujet :

Services Windows

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 464
    Points : 268
    Points
    268
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 464
    Points : 268
    Points
    268
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre éprouvé 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 188
    Points
    1 188
    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 actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 464
    Points : 268
    Points
    268
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
        }
    }

Discussions similaires

  1. Réponses: 19
    Dernier message: 31/10/2005, 15h04
  2. [Upload] probleme d upload de fichier
    Par Stef784ever dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2005, 17h45
  3. Problème de noms de fichiers sur clé USB
    Par karmaki dans le forum Administration système
    Réponses: 4
    Dernier message: 18/04/2005, 16h38
  4. [C#] Probleme de creation de fichier avec Stream
    Par freddyboy dans le forum C#
    Réponses: 7
    Dernier message: 07/06/2004, 11h41
  5. Probleme pour lire un fichier Ini
    Par Sebinou dans le forum C++Builder
    Réponses: 11
    Dernier message: 10/03/2004, 23h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo