C# ouverture fichier erreur

Fermé
Guillaume2020 Messages postés 147 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 20 février 2018 - Modifié par NHenry le 4/11/2016 à 20:55
Guillaume2020 Messages postés 147 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 20 février 2018 - 11 nov. 2016 à 13:53
Bonjour,
J'essaye de faire une classe simple pour traiter le contenu d'un fichier, pour m'entrainer à programmer, mais j'ai un problème :

Ici je fais appel à ma classe :

private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            pat = openFileDialog1.FileName;
            MessageBox.Show(Illis.DclPDoc(pat));
        }




et voici la méthode en question :


public static string DclPDoc(string path)
        {
            string line = "";
            try
            {
                using (StreamReader sr = new StreamReader(path))
                {
                    line = sr.ReadToEnd();
                }
            }
            catch (Exception e)
            {

            }
            line = DecalP(line);
            try
            {
                using (StreamReader sr = new StreamReader(path))
                {
                    File.WriteAllText(path, line);
                }
            }
            catch (Exception e)
            {
                return e.ToString();
            }
            return "reussi";
        }

faites pas attention à la méthode "DecalP" c'est pas elle qui pose problème, elle change juste le contenu de "line"

bon j'avoue que le code est moche, mais la j'ai fait avec du copier collé, pour comprendre les méthodes de lecture de fichier, et apprendre, mais j'aicette erreur :

System.IO.IOException: Le processus ne peut pas accéder au fichier 'C:\Users\Guillaume\Pictures\doritos.jpg', car il est en cours d'utilisation par un autre processus.
à System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
à System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
à System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
à System.IO.StreamWriter.CreateFile(String path, Boolean append, Boolean checkHost)
à System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost)
à System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost)
à System.IO.File.WriteAllText(String path, String contents)
à IllisFiles.Illis.DclPDoc(String path) dans C:\Users\Guillaume\Documents\Visual Studio 2015\Projects\ClassLibrary2\ClassLibrary2\Class1.cs:ligne 53

quelqu'un sait d'ou vient le problème? le fichier ne devrait pas être déja ouvert, donc peut être qu'il est ouvert deux fois par ce meme probramme, mais j'ai besoin d'aide

merci d'avance.



EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

3 réponses

NHenry Messages postés 15047 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 mars 2023 331
4 nov. 2016 à 20:57
Je m'arrête sur la logique de ton code :
using (StreamReader sr = new StreamReader(path))
{
    File.WriteAllText(path, line);
}


Donc tu ouvres ton fichier en lecture et pendant qu'il est ouvert en lecture, tu cherches (par une autre méthode) à écrire dedans ?
0
Guillaume2020 Messages postés 147 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 20 février 2018 17
4 nov. 2016 à 21:31
ahh, oui, c'est vrai, mais du coup je dois faire un "try" avec juste dedans l'écriture?
0
Guillaume2020 Messages postés 147 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 20 février 2018 17
4 nov. 2016 à 21:34
si je fais:
public static string DclMDoc(string path)
{
string line = "";
try
{
using (StreamReader sr = new StreamReader(path))
{
line = sr.ReadToEnd();
}
File.WriteAllText(path, line);
}
catch (Exception e)
{
return e.ToString();
}
line = DecalM(line);
return "reussi";
}

ca me met aussi une erreur, il est aussi utilisé par un autre processus
0
NHenry Messages postés 15047 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 mars 2023 331
4 nov. 2016 à 23:28
Si c'est pour tout lire, pourquoi ne pas faire :
line=System.File.ReadAllText(path);
?

Si c'est pour réécrire les mêmes données, l'opération est inutile, je pense.
0
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
Modifié par Whismeril le 5/11/2016 à 13:39
Salut NHenri

comme toi je ne comprends pas l'intérêt de lire un fichier et en même temps d'y écrire son propre contenu.
Cependant vu le début de son message d'erreur
..C:\Users\Guillaume\Pictures\doritos.jpg..
son fichier est un jpg, donc File.ReadAllText ne va pas fonctionner, pas plus que File.WriteAllText

@ Guillaume, tu n'as pas compris ce que NHenry essayait de te dire alors on va le décomposer dans le code (voir les commentaires)

                using (StreamReader sr = new StreamReader(path))//ici tu crées un stream qui a un accès sur le fichier en lecture seule
                {
                    line = sr.ReadToEnd();//là tu lis le fichier jusqu'à la fin, au passage comme tu ne lit pas une ligne le nom de la variable est inopportun, voire trompeur quand tu demandes de l'aide....
                }
                File.WriteAllText(path, line);//là tu veux écraser le fichier en y mettant son propre contenu, ors tu as déjà 3 lignes plus tôt bloqué ce fichier en lecture seule


Donc, non seulement ça ne sert à rien ce que tu faits, mais c'est ton code qui se bloque lui-même.
Il faut fermer le streamReader, et laisser un peu de temps au système pour "physiquement" libérer le fichier.
0
NHenry Messages postés 15047 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 mars 2023 331
5 nov. 2016 à 13:50
Sauf erreur de ma part, le "using" s'en charge déjà (quand tu sors du bloc (y compris sur une exception), ça fait un Dispose du Stream, donc je pense que ça ferme le fichier aussi).
Il est aussi possible qu'un léger buffer soit présent et que le fichier soit fermé quelques ms trop tard pour que l'écriture puisse l'ouvrir.

Pour lire un fichier au format binaire, il est préférable d'utiliser ReadAllBytes et WriteAllBytes pour l'écrire.
0
Whismeril Messages postés 18279 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 mars 2023 888
5 nov. 2016 à 14:33
Sauf erreur de ma part, le "using" s'en charge déjà (quand tu sors du bloc (y compris sur une exception), ça fait un Dispose du Stream, donc je pense que ça ferme le fichier aussi).
Il est aussi possible qu'un léger buffer soit présent et que le fichier soit fermé quelques ms trop tard pour que l'écriture puisse l'ouvrir.


Oui et oui, le using fait bien un dispose, mais tant que le garage collector n'est pas passé il reste des "trucs" quelque part.
Faire un Close dans la clause using résout parfois le problème
0
Guillaume2020 Messages postés 147 Date d'inscription mardi 2 juin 2015 Statut Membre Dernière intervention 20 février 2018 17
Modifié par Guillaume2020 le 11/11/2016 à 13:54
alors : dsl de mon absence;
réécrire les mêmes données, là n'est pas le problème, (je changerai ca quand j'aurai réussi à le faire)
j'essayais de faire readtoend sur un jpg car c'est ce que je faisais en VB (avec une autre méthode), et ça fonctionnait, c'est bien ce que ça fait quand on ouvre une image avec le bloc notes.
sinon cherchez pas j'ai fait plein d'erreurs, merci pour l'aide, je crois que j'ai ce qu'il me faut
0