LECTURE/ECRITURE DANS FICHIER

spectresombre Messages postés 22 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 26 août 2003 - 14 août 2003 à 21:32
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 - 3 oct. 2007 à 11:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/11558-lecture-ecriture-dans-fichier

cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
3 oct. 2007 à 11:12
J'ai mis cet cet exemple dans un tutorial que vous retrouverez ici :
http://csharpfr.com/tutoriaux/GESTION-EXCEPTION-LECTURE-FICHIER-DIRECTIVE-PRECOMPILATION_749.aspx

Bonne lecture !
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
2 oct. 2007 à 15:44
Pardon, rectification de mon précédent post, mais cette fois avec la fermeture du fichier (c'est mieux) :

FileStream fs = null;
try{
fs = new FileStream("NomDuFichier", FileMode.Open);
StreamReader reader = new StreamReader(fs);
string contenuFichier = reader.ReadToEnd();
}catch(FileNotFoundException fnfEx){
// A faire si le fichier n'existe pas
}catch(Exception ex){
// A faire pour le reste des exceptions
}finally{
if(fs != null) fs.Close();
}
cs_yoannd Messages postés 305 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 août 2011 7
2 oct. 2007 à 15:31
Si je puis me permettre, pour la lecture d'un fichier, il faut mieux utiliser des try catch, non ? Vérifier qu'un fichier existe [if (fi.Exists)], c'est bien, mais cela ne garantit pas que le fichier est accessible en lecture par windows : un vérou peut être posé sur le fichier car un autre process accède au fichier en écriture.

Voila ma solution :
FileStream fs = null;
try{
fs = new FileStream("NomDuFichier", FileMode.Open);
StreamReader reader = new StreamReader(fs);
string contenuFichier = reader.ReadToEnd();
}catch(FileNotFoundException fnfEx){
// A faire si le fichier n'existe pas
}catch(Exception ex){
// A faire pour le reste des exceptions
}
Utilisateur anonyme
19 févr. 2005 à 16:29
bon, je ne sait pas si c'est moi mais ASCIIEncoding.Default je suis obliger de le supprimer parceque sinon rien ne marche...
Ensuite j'ai eu pas mal de problemes avec les FileStream, donc je les ait supprimer et pour les streamreader, j'ai mis :
StreamReader sr = new StreamReader(fichier_ini);
où fichier_ini est une string qui contient le nom du fichier a ouvrir
et pour les streamwriter j'ai mis :
StreamWriter Sw = new StreamWriter(fichier_ini, false);

J'arrive a formatter mon fichier comme je veut mais je voudrait savoir si ce n'est pas dangeureux de ne pas utiliser les ASCIIEncoding.Default et les Filestream parceque l'appli que je developpe doit gerer des comptes de clients et il me faut du code robuste...
Merci de me repondre
PS : Grace a vous, j'ai gagner du temps de lecture dans mes 12 pavé sur le C#
dadavidou2005 Messages postés 2 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 4 août 2004
4 août 2004 à 17:34
J'ai juste oublié de faire une petite correction.

Dans la fonction EcrireFile :

il faut écrire :

public int EcrireFile(string fichier, string variable, string valeur)

au lieu de :

public void EcrireFile(string fichier, string variable, string valeur)

Mille excuses.
dadavidou2005 Messages postés 2 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 4 août 2004
4 août 2004 à 17:24
Voici le code corrigé. (avec la fermeture des descripteurs). :) a+

using System.IO;
using System.Text;

/* LECTURE D'UNE VARIABLE */
public string LireFile(string fichier, string variable)
{
string valeur = "";
FileInfo fi = new FileInfo(fichier);

/* on verifie si le fichier existe puis on ouvre l'acces au fichier */
if (fi.Exists)
{
string s; string[] text;
FileStream fs = new FileStream(fichier, FileMode.Open);
StreamReader sr = new StreamReader(fs);

/* On crée une boucle qui compare les variables lignes par lignes */
/* jusqu'a trouver la variable demandée */
do
{
s = sr.ReadLine();
if ((s !null) && (s.StartsWith(variable) true))
{
text = s.Split(new char[]{':'});
valeur = text[1].Trim();
}
} while (s != null);

fs.Close ();
sr.Close ();

}

/* On retourne la valeur de la variable (retourne chaine vide si pas trouvé) */
return valeur;

}


/* AJOUTER UNE VARIABLE ET SA VALEUR */
public void EcrireFile(string fichier, string variable, string valeur)
{

int flag;
FileInfo fi = new FileInfo(fichier);

/* On recupère le texte complet du fichier */
if (fi.Exists) // on verifie ke le fichier existe
{
flag = 1;
StreamWriter sw = new StreamWriter(fichier, true, ASCIIEncoding.Default);
sw.Write(variable + " : " + valeur + "\r\n");
sw.Close();

}
else
{
flag = 0;
}
/* On retourne la valeur du drapeau (retourne 0 si pas trouvé) */
return flag;
}


/* MODIFICATION DE LA VALEUR D'UNE VARIABLE */
public void ModifFile(string fichier, string variable, string valeur)
{

FileInfo fi = new FileInfo(fichier);

if (fi.Exists) // si le fichier existe
{

/* On met la totalité du fichier dans un variable */
StreamReader sr = new StreamReader(fichier, ASCIIEncoding.Default);
string s = sr.ReadToEnd();
sr.Close();

/* On trouve ou est placé la variable dans le fichier */
int i = s.IndexOf(variable);

/* On trouve la fin de la ligne de cette variable */
int n = s.IndexOf("\r\n", i);

/* On récupère la chaine dans la variable p */
string p = s.Substring(i, n - i);

/* Enfon on remplace p par la variable + valeur donnée */
s = s.Replace(p, variable + " : " + valeur);
StreamWriter sw = new StreamWriter(fichier, false, ASCIIEncoding.Default);
sw.Write(s);
sw.Close();
}

}

Testé et approuvée !
Jujufouq Messages postés 254 Date d'inscription jeudi 27 décembre 2001 Statut Membre Dernière intervention 5 mars 2006
23 avril 2004 à 17:43
Je cherche à modifier une séquence d'octets dans un fichier de plusieurs GigaOctets par une autre séquence d'octets de même taille que la première. Il est bien évident que je ne vais pas faire passer le fichier dans une variable... alors comment faire???
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
18 sept. 2003 à 11:18
Pour LireFile(fichier, variable), et peut-être pour d'autres, j'ai pas vérifié, je ne vois pas de sr.Close(). Il faut toujours les fermer.

Je pense que ton code pour modifier une variable plante s'il n'y a qu'une seule variable dans le fichier. Il ne trouvera pas le "
" et ça retournera -1, tu feras donc un substring avec un indice négatif. A vérifier quand même... Ca vient du fait que quand tu lis une ligne de fichier, ça enlève les marques de fin de ligne.
spectresombre Messages postés 22 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 26 août 2003
18 août 2003 à 11:28
Et pour Tommz : J'accepte volontiers les critiques sauf celles de personne qui ne mettent pas de sources :)
spectresombre Messages postés 22 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 26 août 2003
18 août 2003 à 09:43
Pour la présentation j'avoue ke la mise en page n'est pas extra (un vendredi soir avant de quitter le taf j'étais pressé lol)
Par contre "super fermé"..... C'est pas censé faire le café ce script.
cs_tommz Messages postés 11 Date d'inscription lundi 4 août 2003 Statut Membre Dernière intervention 3 mars 2004
17 août 2003 à 18:57
comme gg00xiv...
c'est mal codé en plus et c'est super fermé comme code..
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
16 août 2003 à 15:12
illisible, surtout si ca sadresse au debutants ...
spectresombre Messages postés 22 Date d'inscription mardi 28 janvier 2003 Statut Membre Dernière intervention 26 août 2003
14 août 2003 à 21:32
J'ai oublie de préciser de rajouter un using System.IO et un using System.Text :)
Rejoignez-nous