Modifier un fichier (lecture/écriture)

Résolu
Signaler
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006
-
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006
-
Bonjour à tous.

Bon, j'ai cherché un peu partout sur le forum, mais je n'ai pas trouvé mon bonheur.

Voilà mon souci : j'aimerais savoir si on c#, on peut utiliser les méthodes :
fopen, fseek, fgetc, fputs et fclose. Et aussi l'objet FILE.
Si oui, comment faire ? (genre ajout stdio.h, mais comment)

Sinon, voilà ce dont j'ai besoin : ouvrir un fichier texte en lecture ET écriture à la fois. Puis je le lis caractère par caractère. Lorsque que je tombe sur une certaine chaîne, je reviens de 1 caractère en arrière (j'explique plus bas pourquoi) pour insérer une autre chaîne.

Le pourquoi de tout ça ? Donc : je veux rajouter à la suite d'une chaîne ABC, la chaîne DEF, mais seulement si ce n'est pas déjà la chaîne ABCDEF. Voilà le pourquoi de mon retour arrière, car je teste si la chaîne n'est pas déjà entière.
Et j'aimerais évité de passer par un second fichier (si c'est possible bien sûr).

J'espère avoir été clair.

Je vous remercie,

++

PS : c'est mon tout premier prog en c#. J'aurais pu le faire en Delphi, mais j'ai eu envie de me mettre au c#.

17 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Salut!
Ben non, ta question ne s'affiche pas mieux ailleurs 

Pour ce qui est de la manipulation des fichiers en C#, tu trouveras tout ce que tu as besoin dans le namespace System.IO. Des fonctions équivalentes aux " fopen, fseek, fgetc, fputs et fclose." existe bien entendu...
Pour l'utilisation de ces classes, tu trouveras pleins d'exemples sur le site.


<hr>






[Pub]
http://www.csharpfr.com/auteurdetail.aspx?ID=13319
[\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319
/auteurdetail.aspx?ID=13319



/auteurdetail.aspx?ID=13319
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Salut,

Si tu utilises Opera, passe plutôt par IE ou FF, sinon les sauts de ligne sont quelque peu mis à mal.

/*
coq
MVP Visual C#
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Oui, le Framework .Net doit être installé sur le poste executant l'application.

/*
coq
MVP Visual C#
*/
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Hum, j'espère que ça s'affichera mieux hez vous, car chez moi, tous les paragraphes se sont condensés (je parle de la mise en forme de ma question).
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Merci pour vos réponses.

Effectivement je suis sous Opera (à part pour ce post ci).

Je vais regarder les System.IO. J'ai vu qu'il y avait streamwriter et streamreader, mais le peu que j'en ai lu ne m'a pas parû pratique. J'espère trouver les équivalents.

++
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Voilà, mon prog est fini.

C'est un petit outil perso pour me simplifier la vie ... LOL

Bon j'explique, je code mon php à l'aide de textpad, à l'ancienne. Et je voulais automatiser le remplacement des balise <? par <?php, pour éviter les problèmes de compatibilité. Je sais qu'il existe des environnements de dev php qui le permettent (sûrement), mais je ne suis pas un grand fan des programmes dont 90% des fonctionnalités me sont inutiles.
De plus, cela m'aura permis de me mettre au C#.

Pour en venir à mon appli : je voulais donc remplacer les <? par <?php. J'ai donc copié le contenu de mon fichier dans une chaîne (cela me dérangeait au début, mais bon, ce ne sont pas des fichiers de plusieurs Mo en général, bref) et j'ai utilisé la méthode Replace. Oui mais voilà, si j'avais fait seulement fait s = s.Replace("<?", "<?php"), cela m'aurait aussi changé les <?php en <?phpphp.
J'ai donc feinté le problème en remplaçant <?php par <!?php.

Oui je sais, cela fait bidouille, mais bon, c'est à mon avis le plus simple.

Voilà donc la partie du code sur les fichiers (ça marche, mais si vous voyez des modifs à faire, je suis preneur) :

string s;
string message_fin;


if (listBox1.Items.Count > 0)
{
 for (int i = 0 ; i < listBox1.Items.Count ; i++)
 {
  // Lecture fichier
  StreamReader fr = new StreamReader(listBox1.Items[i].ToString());
  s = fr.ReadToEnd();
  fr.Close();
  s = s.Replace("<?php", "<!?php");
  s = s.Replace("<?", "<?php");
  s = s.Replace("<!?php", "<?php");
  StreamWriter fw = new StreamWriter(listBox1.Items[i].ToString(), false);
  fw.Write(s);
  fw.Close();
 }


 if (listBox1.Items.Count == 1)
 {
  message_fin = "Fichier modifié";
 }
 else
 {
  message_fin = "Fichiers modifiés";
 }
 MessageBox.Show(message_fin);
}

PS : au fait, si je veux passer l'exe à quelqu'un, dois-je lui fournir autre chose (genre le framework, ou des librairies) ?
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Ok. J'aimais bien le Borland Delphi, car l'exe suffisait.
Mais bon, s'il n'y a que ça à fournir, ça va encore.
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Merci Bidou. Je ne suis pas famillié avec les expressions régulières, je vais faire quelques recherches.
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Ok, j'ai un peu regardé.

\B c'est la fin du mot. Mais ce ne serait pas \b à mettre au début pour lui dire début de mot ?

Et je ne comprends pas le @, il sert à quoi ?

Enfin, pour la seconde chaîne, on n'applique pas le formalisme des epressions régulières ? Il ne faudrait pas mettre <\?php ?
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Ok, j'ai compris le @, cela sert à dire que c'est une expression régulière.
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Bon, j'ai testé ta commande. Mais pourquoi le premier \B, et non \b ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
La ligne

  s = System.Text.RegularExpressions.Regex.Replace(s, @"\B<\?\B", "<?php");

Remplace

  s = s.Replace("<?php", "<!?php");
  s = s.Replace("<?", "<?php");
  s = s.Replace("<!?php", "<?php");

Pour des gros fichiers ou des recherches complexes, c'est plus rapide d'utiliser les expressions régulières. Pour des petits fichiers et des cas simples, on préfères utilise la classe string...
le "@" est juste une simplification d'écriture. Sans ça, on aurait du écrire : \\B<\\?\\B

<hr>
[Pub]
http://www.csharpfr.com/auteurdetail.aspx?ID=13319[\Pub]
C# forever /infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319
/infomsg/auteurdetail.aspx?ID=13319/infomsg/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319/auteurdetail.aspx?ID=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Messages postés
41
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
30 avril 2006

Ok, merci.