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 :

C# 1.1 Application console: ERREUR IMPOSSIBLE DE SUPPRIMER UN FICHIER CSV


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut C# 1.1 Application console: ERREUR IMPOSSIBLE DE SUPPRIMER UN FICHIER CSV
    Bonjour ,

    Je suis sous le FRAMEWORK 1.1, j'ai fais une application console permettant l'import automatique d'un fichier csv.
    1) Je déclare une variable qui contient le chemin complet du fichier.
    2) Je copy mon le contenu de mon fichier csv dans un fichier txt temporaire.
    3) Je parse le fichier txt que j'insere dans la table de ma BDD .
    4) Je supprime le fichier txt
    5) Je supprimer le fichier csv


    L'erreur se produit quand j'ai ajouté la ligne File.delete(monFichierCsv) donc c'est à dire l'étape 5, l'erreur est la suivante :

    "Le processus ne peut pas accéder au fichier , car il est en cours d'utilisation par un autre processus."


    Je voudrais savoir si quelqu'un a eut le même problème et comment a-t-il fait pour le résoudre?

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 288
    Points : 375
    Points
    375
    Par défaut
    Montre nous ton code que l'on puisse t'aider, tu as sans doute oublier de libérer la ressource à un endroit.

    Oublie pas de commencer par lire les cours de formation pour apprendre la programmation C# : http://dotnet.developpez.com/cours/?page=csharp

  3. #3
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    tu as pensé à fermer le fichier avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monStreamReader.Close();
    à moins que tu ne passes pas en streamreader. Mais dans tous les cas le message semble indiquer que tu ne refermes pas ton fichier après l'avoir exploité.

    Cordialement,
    Lyche

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut CODE
    Citation Envoyé par DroP Voir le message
    Montre nous ton code que l'on puisse t'aider, tu as sans doute oublier de libérer la ressource à un endroit
    Fonction importDonnées:


    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
     
    DirectoryInfo dossier = new DirectoryInfo(path);
     
    foreach (FileInfo mesfichiers in dossier.GetFiles("*.csv"))
    {
      Console.WriteLine(mesfichiers.FullName); 
      path = mesfichiers.FullName.ToString();
    }	
     
    if (File.Exists(path)) 
        File.OpenRead(path);
     
    StreamReader sr	=	File.OpenText(path);
    string content = sr.ReadToEnd();
     
    import.ValidImport(path);
     
    File.Delete(path);
    Fonction ValidImport(path)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private void ValidImport(string path)
    {
    string cheminFichier= "C:\\Temporaire_file\\monfichier.txt";
     
    try
    {
     
    File.Copy(path,cheminFichier);
    this.importation(cheminFichier);
     
    }
     
    }
    Fonction Importation
    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
     
    private void importation(string cheminFichier)
    {
    try
    {  
    StreamReader fichier = File.OpenText(cheminFichier);
    ...
    Ensuite je déclare cette variable pour lire ligne à ligne : 
    string lignes = fichier.ReadLine();
    }
    catch ...
     puis dans le finally : 
     
    finally
    {
      fichier.Close();
    }
     
    }
    Désolé pour l'indentation mais je n'ai pas l'habitude du site la c'est pour cela voilà .

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Lyche Voir le message
    tu as pensé à fermer le fichier avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monStreamReader.Close();
    à moins que tu ne passes pas en streamreader. Mais dans tous les cas le message semble indiquer que tu ne refermes pas ton fichier après l'avoir exploité.

    Cordialement,
    Lyche

    Merci j'ai déja fait ja fais sr.close() juste avant de faire :
    File.Delete(path);


    ca ne marche pas :s

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 288
    Points : 375
    Points
    375
    Par défaut
    if (File.Exists(path))
    File.OpenRead(path);

    StreamReader sr = File.OpenText(path);
    string content = sr.ReadToEnd();

    import.ValidImport(path);

    File.Delete(path);
    Tu ne dispose pas ta variable sr !!
    je te conseille plutot d'utiliser des using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (File.Exists(path)) 
        File.OpenRead(path);
    
    using (StreamReader sr = File.OpenText(path))
    {
    string content = sr.ReadToEnd();
     
    import.ValidImport(path);
    }
     
    File.Delete(path);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par DroP Voir le message
    Tu ne dispose pas ta variable sr !!
    je te conseille plutot d'utiliser des using :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (File.Exists(path)) 
        File.OpenRead(path);
    
    using (StreamReader sr = File.OpenText(path))
    {
    string content = sr.ReadToEnd();
     
    import.ValidImport(path);
    }
     
    File.Delete(path);
    Merci à tout le monde de me répondre pour commencer .

    Sinon en ce qui concerne de dispose ma variable sr je ne sais pas comment faire ? Et j'ai tester avec ton using j'ai toujours la même erreur.

  8. #8
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    juste avant ton sr.Close(); place un sr.Dispose();
    Dispose libère les ressources utilisée par la machine, là tu es sur que ça ne vient pas de ça.
    Une question, le fichier texte est généré comment?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Lyche Voir le message
    juste avant ton sr.Close(); place un sr.Dispose();
    Dispose libère les ressources utilisée par la machine, là tu es sur que ça ne vient pas de ça.
    Une question, le fichier texte est généré comment?
    Je peux pas faire de sr.Dispose() cela me générer une erreur de type :

    'System.IO.TextReader.Dispose(bool)' est inaccessible en raison de son niveau de protection


    Sinon pour le fichier texte il est générer de cette maniere :
    string cheminFichier = "C:\\Temporaire_file\\file.txt";
    // copy du fichier csv dans le fichier texte

    File.Copy(path,cheminFichier);

  10. #10
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Juste une question d'ordre technico-pratique. Pourquoi tu passes du fichier csv au fichier texte? Pourquoi tu insères pas directement tes données dans ta bdd? Les fichiers csv sont prévu pour. Avec un Split de ta ligne tu peux envoyer les données, ou alors tu split en T-SQL. ça pourrait t'éviter des manipulations de fichiers et de te retrouver avec des traitements plus longs.
    Mais je dis ça, celà n'engage que moi ^^

    Cordialement,
    Lyche

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Lyche Voir le message
    Juste une question d'ordre technico-pratique. Pourquoi tu passes du fichier csv au fichier texte? Pourquoi tu insères pas directement tes données dans ta bdd? Les fichiers csv sont prévu pour. Avec un Split de ta ligne tu peux envoyer les données, ou alors tu split en T-SQL. ça pourrait t'éviter des manipulations de fichiers et de te retrouver avec des traitements plus longs.
    Mais je dis ça, celà n'engage que moi ^^

    Cordialement,
    Lyche
    Parce que le code était déjà tout fait, je débug et je n'ai pas assez de connaissance en .NET ( 1.1 ) donc j'apprends, et comme je passe derriere quelqu'un je code de manière cohérente avec ce qui a déjà été fait étant donnée que chaque page fait 2500 lignes de code et qu'il y en a une trentaine avec des fonctions qui se croisent de partout ...
    Voilà pourquoi ....

    Mais si tu as des liens qui explique bien ce que tu me dis je suis open en attendant faut que je règle ce problème ...

    Merci en tout cas pour ces réponses.

    Quelqu'un a-t-il d'autres solutions ???


    Cordialement

  12. #12
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    En effet, ça me paraît compliqué de pouvoir faire autrement, mais, essaye de lire directement ton fichier csv plutot que de passer par un fichier txt. Les deux fichiers se traitent de la même façon, celà t'enlève juste l'étape de transfert dans le fichier texte. Cela te fera gagner du temps sur ton exécution de processus et cela facilitera la maintenance.
    Au pire tu peux inverser ton processus, tu supprimes et recré ton fichier texte en début de traitement, comme ça tu es sur que tu ne t'en sers pas encore.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (File.Exists(path)) File.delete(); File.logFileCreate();
    parfois inverser un problème permet de le résoudre plus facilement ^^.
    Enfin ce ne sont que mes idées pas toujours très pertinentes.

    Cordialement,
    Lyche

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    1) Est ce que quelqu'un sait pourquoi je ne peux pas supprimer ce fichier ?
    2) Et pourquoi je ne peux pas faire mon sr.Dispose() ?

    - Dispose ne marche pas sous Framework 1.1 ?
    - Faut il déclarer un using ?
    - Une assembly spéciale ?

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le fichier .csv ne serait-il pas ouvert sous Excel au moment de la suppression ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Graffito Voir le message
    Le fichier .csv ne serait-il pas ouvert sous Excel au moment de la suppression ?
    LOL ?

    Je sais que je ne suis pas super fort en programmation mais je ne suis pas con non plus =) je suis pas un boulet à ce point ...

  16. #16
    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
    Dans ton import tu fais un appel à File.OpenRead. Cette méthode renvoie un objet de type FileStream que tu ne récupères pas et que donc tu ne libères pas au final. C'est peut être la raison pour laquelle la libération du StreamReader ne suffit pas à résoudre ton problème.

    Au passage (en supposant que le code donné est vraiment celui utilisé) :
    - la boucle foreach ne sert à rien dans l'état
    - le File.OpenRead non plus
    - le test d'existence du fichier est également inutile vu comment est récupéré le nom de ce fichier. Il vaut mieux voir si des fichiers ont été trouvés.

    Sinon, pour récupérer le contenu de ton fichier tu peux le faire sans passer par un flux intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string content = File.ReadAllText(path);
    Un équivalent, sans objets de type flux, de ton code pour la méthode d'import, juste pour la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Récupère les fichiers CSV contenu dans un répertoire donné
    string[] files = Directory.GetFiles(path, "*.csv");
    // Si on a trouvé des fichiers
    if (files.Length != 0)
    {
        // Remplace le foreach en prenant le dernier fichier
        // en admettant que le code donné soit vraiment celui utilisé
        string file = files[files.Length - 1];
        // Récupère le contenu du fichier
        string content = File.ReadAllText(file);
    }

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Dans ton import tu fais un appel à File.OpenRead. Cette méthode renvoie un objet de type FileStream que tu ne récupères pas et que donc tu ne libères pas au final. C'est peut être la raison pour laquelle la libération du StreamReader ne suffit pas à résoudre ton problème.

    Au passage (en supposant que le code donné est vraiment celui utilisé) :
    - la boucle foreach ne sert à rien dans l'état
    - le File.OpenRead non plus
    - le test d'existence du fichier est également inutile vu comment est récupéré le nom de ce fichier. Il vaut mieux voir si des fichiers ont été trouvés.

    Sinon, pour récupérer le contenu de ton fichier tu peux le faire sans passer par un flux intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string content = File.ReadAllText(path);
    Un équivalent, sans objets de type flux, de ton code pour la méthode d'import, juste pour la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Récupère les fichiers CSV contenu dans un répertoire donné
    string[] files = Directory.GetFiles(path, "*.csv");
    // Si on a trouvé des fichiers
    if (files.Length != 0)
    {
        // Remplace le foreach en prenant le dernier fichier
        // en admettant que le code donné soit vraiment celui utilisé
        string file = files[files.Length - 1];
        // Récupère le contenu du fichier
        string content = File.ReadAllText(file);
    }


    Merci pour ce cours de C# mais j'ai mentionné que je bossais sur la version 1.1 or la fonction READALLTEXT() n'est pas supporté elle fonctionne sous le framework 2.0 , 3.0 , 3.5 .

    Donc ton code ne peut pas fonctionner merci quand même de m'aider.

    Cordialement.

  18. #18
    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
    Erf, j'étais pourtant sûr qu'elle était disponible avec le 1.1

    En tout cas, ça ne change rien concernant le fait que ton File.OpenRead renvoie un FileStream qui tu ne récupères pas et donc ne libère pas (Close ou Dispose). C'est sûrement la raison du problème si tu libères bien le StreamReader.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Erf, j'étais pourtant sûr qu'elle était disponible avec le 1.1

    En tout cas, ça ne change rien concernant le fait que ton File.OpenRead renvoie un FileStream qui tu ne récupères pas et donc ne libère pas (Close ou Dispose). C'est sûrement la raison du problème si tu libères bien le StreamReader.
    Ouppppssss!!!! désolé de répondre si tardivement je m'en excuse en tout cas même si ce que tu m'as donné ne fonctionne pas sous 1.1, la fonction File.OpenRead renvoie bien un stream et c'est ce qui me bloquait merci à tous de m'avoir aider , je suis pas doué j'ai cherché tout sur la msdn sauf cette fonction errrrrrffFF ... Quelle perte de temps !!! Merci encore StormimOn et les autres ...

    Eu tout cas merci pour le lien sur les cours de formation pour apprendre la programmation C# c'est super : http://dotnet.developpez.com/cours/?page=csharp

    Cordialement

  20. #20
    Membre actif Avatar de g_tarik0010
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 186
    Points : 284
    Points
    284
    Par défaut
    Bonjour,
    je voulais donner une sollution,car j'ai pas vu le flag resolu,

    donc essaye de le mettre sur

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

Discussions similaires

  1. Erreur: impossible de verouiller le fichier
    Par alicia26 dans le forum Sécurité
    Réponses: 3
    Dernier message: 15/01/2009, 15h18
  2. [FluxBB] [punBB] Comment résoudre l'erreur : impossible d'écrire le fichier cache
    Par chk9300 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 12/04/2007, 17h24
  3. impossible de supprimer le fichier !
    Par asoka13 dans le forum Windows XP
    Réponses: 3
    Dernier message: 27/06/2006, 09h20
  4. Impossible d'importer un fichier csv dans une table sous MySQL
    Par manue85 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 20/04/2006, 12h06
  5. [Erreur]impossible de trouver le fichier de config du moteur
    Par julietteste dans le forum Bases de données
    Réponses: 5
    Dernier message: 10/05/2005, 18h34

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