C# ouverture fichier erreur

Fermé
Utilisateur anonyme - Modifié par NHenry le 4/11/2016 à 20:55
 Utilisateur anonyme - 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 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
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
Utilisateur anonyme
4 nov. 2016 à 21:31
ahh, oui, c'est vrai, mais du coup je dois faire un "try" avec juste dedans l'écriture?
0
Utilisateur anonyme
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 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
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 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
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 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 330
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 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
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
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