Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fichier déjà en cours d'utilisation

Sujet résolu
    29 avril 2019 à 15:04:12

    Bonjour,

    J'ai un problème sur mon code C# et je viens donc demander votre aide pour m'aider à le résoudre.

    Voici en le fonctionnement de l'application :

    Je dispose d'une interface graphique Windows Form qui me permet de configurer mon outil. Je peux cliquer sur un bouton démarrer qui permet l'exécution d'un nouveau thread créant un FileSystemWatcher pour mettre un dossier sur écoute. Lorsqu'un nouveau fichier est crée dans ce dossier, un un autre thread est crée pour lire ce nouveau fichier.

    Mon problème est le suivant : je reçois une erreur me disant que le fichier est déjà en cours d'exécution (à partir du deuxième fichier lu). Cependant, quand je fais l'essai en mode débogue, je n'ai pas cette erreur et je traiter tous les nouveaux fichiers sans problèmes !

    Voici le code qui est appelé lors de la création d'un nouveau fichier et exécuté par un thread :

    private void ProcessFile(object pathToFile)
            {
                List<classes.VIPSGeneratedTextFileLine> lines = new List<classes.VIPSGeneratedTextFileLine>();
    
                try
                {
                    using (StreamReader reader = new StreamReader((string)pathToFile))
                    {
                        string line;
    
                        while ((line = reader.ReadLine()) != null)
                        {
                            classes.VIPSGeneratedTextFileLine VIPSTextLine = new classes.VIPSGeneratedTextFileLine();
                            VIPSTextLine.NomFichier = (string)pathToFile;
    
                            int nbSeparateurs = 0;
                            string mot = "";
    
                            foreach(char c in line)
                            {
                                if (c != '#')
                                    mot += c.ToString();
                                else
                                {
                                    nbSeparateurs++;
                                    // Traitement
                                }
                            }
    
                            lines.Add(VIPSTextLine);
                        }
                    }
    
                    WriteLog("Fichier " + (string)pathToFile + " traité.");
                    SaveToFile(ToJsonLines(lines), GetFileName((string)pathToFile));
                }
                catch(Exception ex)
                {
                    using (StreamWriter w = new StreamWriter("Erreurs.txt"))
                    {
                        w.WriteLine(ex.ToString());
                    }
                }
            }

    Si vous pouviez m'aider à résoudre cela !

    Cordialement

    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2019 à 14:56:02

      C'est un problème de timing. C'est normal qu'en DEBUG vous ne le voyez pas si vous faites du pas à pas.

      L'action de créer un fichier n'est pas "atomique", le programme le créant ayant un verrou dessus, généralement.

      Et c'est tout ce qu'il y a de normal.

      Votre conception est foireuse, on ne fait pas de communication via la création de fichier.

      Une chose bien plus sûre, c'est d'attendre un "renommage" du fichier, qui est une action atomique dans un très grand nombre de système de fichier.

      Si votre processus en amont a été conçu correctement, il utilise le mécanisme de "création/remplissage/fermeture/renommage", permettant aux processus an aval de travailler dans de bonnes conditions.

      P.S.: Dégagez-moi se catch tout pourri !!!

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Fichier déjà en cours d'utilisation

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown