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

C# Discussion :

le processus ne peut pas accéder au fichier car il est utilisé


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut le processus ne peut pas accéder au fichier car il est utilisé
    Hello

    J'obtiens le message
    le processus ne peut pas accéder au fichier car ce fichier es utilisé par un autre processus
    lorsque j'essaie d'accéder à un fichier avec une commande du type File.Open(MonFichier) ...

    Il semblerait que c'est lié au fait que mon fichier n'a pas été correctement fermé ...

    Alors ma question est : comment fait-on pour fermer correctement un fichier ???

    MERCI !

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FileStream monstream=File.Open("Fichier",mode);
    monstream.Close();
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par olibara Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FileStream monstream=File.Open("Fichier",mode);
    monstream.Close();
    Merci olibara mais ca ne marche pas !

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Peux tu montrer to code ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Le fichier que tu cherches à ouvrir, est-il ouvert ailleurs dans ton code ? A ce moment il faudrait le fermer avant (si possible dès qu'il n'est plus utile).

    Ou bien est-il ouvert par une application externe ? Dans ce dernier cas il est alors possible qu'il soit ouvert en accès exclusif auquel cas tu ne pourras pas l'ouvrir.
    Pas de questions techniques par MP

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par olibara Voir le message
    Peux tu montrer to code ?

    Ca ressemble à peu près à celà :

    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
     
                  FileStream fs = new FileStream(fileName, FileMode.Create);
                    BinaryWriter BW = new BinaryWriter(fs);
                    BW.Write(DateHeureCreation);  
                    BW.Write(Form1.VersionSoft); 
                    BW.Write(this.N);
                    BW.Write(this.Gauss.g1); 
                    BW.Write(this.Gauss.g2);
                ....
                    BW.Write(this.Monde.reservoirs);
                    BW.Write(this.Monde.max_time);
                    BW.Write(this.Monde.objec_perfo);
                    BW.Write(this.Monde.objec_complex);
     
                    BW.Close();
                    fs.Close();
    Cette séquence peut être appelée plusieurs fois consécutivement. La première fois, no problem, mais ensuite ça plante !


    Merci

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je ne vois pas de probleme fondamental dans ton code
    Mais comme le suggere Stormimonn il faudrait peut etre vérifier dans l'environnement général les acces possible a ce fichier !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Le fichier que tu cherches à ouvrir, est-il ouvert ailleurs dans ton code ? A ce moment il faudrait le fermer avant (si possible dès qu'il n'est plus utile).

    Ou bien est-il ouvert par une application externe ? Dans ce dernier cas il est alors possible qu'il soit ouvert en accès exclusif auquel cas tu ne pourras pas l'ouvrir.
    Hello

    Je ne pense pas appeler ce fichier ailleurs que dans ces lignes de code ...

    Un autre phénomène étrange : ce pb n'apparait pas sur toutes les machines ...


  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et quand le problème survient ?
    C'est systematiquement au deuxieme appel ?
    C'est aléatoire ?
    Peux tu le reproduire en step by step a la main ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par olibara Voir le message
    Et quand le problème survient ?
    C'est systematiquement au deuxieme appel ?
    C'est en effet quasi systématiquement au deuxieme appel


    Citation Envoyé par olibara Voir le message
    Peux tu le reproduire en step by step a la main ?
    Oui et j'ai le message
    le processus ne peut pas accéder au fichier car ce fichier es utilisé par un autre processus
    au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileStream fs = new FileStream(fileName, FileMode.Create);

  11. #11
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Salut,
    une bonne pratique est d'utiliser la syntaxe avec le mot-clé 'using' pour les objets qui implémentent IDisposable (tels que les stream).
    Ex. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    using (var fs = new FileStream(@"C:\toto\tata.dat"))
    {
        //code...
    }
    //Quoi qu'il arrive, 'fs.Dispose()' est appelé et donc le flux est libéré.

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Metalgeek a raison

    Mais ici ce n'est pas un problème de dispose de l'objet mais de collision d'acces au fichier qui devrait avoir été fermé donc accessible

    Mais j'imagine que le step by step tu le fait en mettant un breakpoint quelque part
    A mon avis un autre process ou thread accede ce fichier

    Que se passe-t-il si tu reouvre le fichier imédiatement apres fermeture

    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
    FileStream fs = new FileStream(fileName, FileMode.Create);
                    BinaryWriter BW = new BinaryWriter(fs);
                    BW.Write(DateHeureCreation);  
                    BW.Write(Form1.VersionSoft); 
                    BW.Write(this.N);
                    BW.Write(this.Gauss.g1); 
                    BW.Write(this.Gauss.g2);
                ....
                    BW.Write(this.Monde.reservoirs);
                    BW.Write(this.Monde.max_time);
                    BW.Write(this.Monde.objec_perfo);
                    BW.Write(this.Monde.objec_complex);
     
                    BW.Close();
                    fs.Close();
     
                    fs = new FileStream(fileName, FileMode.Create);
                    BW = new BinaryWriter(fs);
                    BW.Write(DateHeureCreation);  
                    etc...
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par olibara Voir le message
    Salut

    Metalgeek a raison

    Mais ici ce n'est pas un problème de dispose de l'objet mais de collision d'acces au fichier qui devrait avoir été fermé donc accessible

    Mais j'imagine que le step by step tu le fait en mettant un breakpoint quelque part
    A mon avis un autre process ou thread accede ce fichier

    Que se passe-t-il si tu reouvre le fichier imédiatement apres fermeture

    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
    FileStream fs = new FileStream(fileName, FileMode.Create);
                    BinaryWriter BW = new BinaryWriter(fs);
                    BW.Write(DateHeureCreation);  
                    BW.Write(Form1.VersionSoft); 
                    BW.Write(this.N);
                    BW.Write(this.Gauss.g1); 
                    BW.Write(this.Gauss.g2);
                ....
                    BW.Write(this.Monde.reservoirs);
                    BW.Write(this.Monde.max_time);
                    BW.Write(this.Monde.objec_perfo);
                    BW.Write(this.Monde.objec_complex);
     
                    BW.Close();
                    fs.Close();
     
                    fs = new FileStream(fileName, FileMode.Create);
                    BW = new BinaryWriter(fs);
                    BW.Write(DateHeureCreation);  
                    etc...
    Hello olibra,

    Si je reouvre le fichier imédiatement apres fermeture (en rajoutant ton code), ça ne plante pas !

    Par contre, ça replentera comme d'hab au second passage ...

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Donc ca signifie bien que tu dois chercher ailleurs ce qui peut se passer !

    Ou que dans les .... que tu a représenté il y a une condition de sortie qui evite la fermeture
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Bon ça y est, je crois avoir trouvé le HIC ...

    J'utilise à un endroit des instructions try / catch et il s'y produit un plantage qui conduit à passer au code dans catch{ ...} sans exécuter la fin du code dans try{ ...}. Or c'est dans la fin de ce code que se trouve un fs.Close() qui n'est donc jamais exécuté et donc un fichier n'est jamais fermé ...

    (j'espère que c'est assez clair comme explication ... )

  16. #16
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    C'est tout a fait clair

    Et c'est bien ce qu'on t'avait suggéré !

    Ou que dans les .... que tu a représenté il y a une condition de sortie qui evite la fermeture
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  17. #17
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par vladvad Voir le message
    J'utilise à un endroit des instructions try / catch et il s'y produit un plantage qui conduit à passer au code dans catch{ ...} sans exécuter la fin du code dans try{ ...}. Or c'est dans la fin de ce code que se trouve un fs.Close() qui n'est donc jamais exécuté et donc un fichier n'est jamais fermé ...
    Pour la libération des ressources (appel de Dispose) il faut utiliser soit un bloc try/catch/finally soit un bloc using. Sinon ce genre de problème arrive.
    Pas de questions techniques par MP

  18. #18
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Pour la libération des ressources (appel de Dispose) il faut utiliser soit un bloc try/catch/finally soit un bloc using. Sinon ce genre de problème arrive.
    +1
    Mais aucun garde fou ni protection ne dispense de regarder attentivement la logique de ce que l'on fait.
    Un bon air-bag ne permet pas de ne plus regarder la route !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Moi qui n'utilisais jamais de finally { } , je vais revoir ma façon de faire ...

    Merci à tous pour votre aide

    Je classe donc ce sujet dans "Résolu" ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/09/2014, 09h51
  2. Réponses: 4
    Dernier message: 21/01/2014, 07h15
  3. Réponses: 6
    Dernier message: 25/05/2012, 20h56
  4. Réponses: 22
    Dernier message: 02/10/2009, 10h31
  5. Erreur : Le processus ne peut pas accéder au fichier
    Par victor72 dans le forum Dev-C++
    Réponses: 1
    Dernier message: 16/03/2007, 14h50

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