Modifier un fichier (lecture/écriture)

Résolu
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006 - 29 avril 2006 à 20:46
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006 - 30 avril 2006 à 14:04
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
29 avril 2006 à 21:17
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
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
29 avril 2006 à 21:19
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#
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
30 avril 2006 à 00:55
Oui, le Framework .Net doit être installé sur le poste executant l'application.

/*
coq
MVP Visual C#
*/
3
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
29 avril 2006 à 20:48
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).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
29 avril 2006 à 23:14
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.

++
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 00:31
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) ?
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 01:03
Ok. J'aimais bien le Borland Delphi, car l'exe suffisait.
Mais bon, s'il n'y a que ça à fournir, ça va encore.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
30 avril 2006 à 10:37
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 12:17
Merci Bidou. Je ne suis pas famillié avec les expressions régulières, je vais faire quelques recherches.
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 12:41
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 ?
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 12:52
Ok, j'ai compris le @, cela sert à dire que c'est une expression régulière.
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 12:54
Bon, j'ai testé ta commande. Mais pourquoi le premier \B, et non \b ?
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
30 avril 2006 à 12:56
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
30 avril 2006 à 13:23
0
cs_haklia Messages postés 41 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 30 avril 2006
30 avril 2006 à 14:04
Ok, merci.
0
Rejoignez-nous