Bonjour,

je cherche à faire une petite fonction qui permet l'édition de fichier et grossièrement, patcher.

Par exemple, le cas d'un fichier d'un fichier texte, contenant des informations dans le genre:
Bonjour <NOM>
le <MESSAGE1> vous salut
avec <MESSAGE2> d'enthousiasme
à bientôt...
L'appel de la fonction avec ces arguments:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ReplaceInFile("fichier.txt", new string[] { "NOM", "MESSAGE1", "MESSAGE2" }, new string[] { "dtcSearch", "lion de la Savane", "beaucoup" });
Devrait produire le résultat:
Bonjour dtcSearch
le lion de la Savane vous salut
avec beaucoup d'enthousiasme
à bientôt...
Voici la fonction (qui ne fonctionne pas):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void ReplaceInFile(string path, string[] keys, string[] values)
{
    MessageBox.Show("fonctionne pas...");
    if (File.Exists(path))
    {
        int ipos;
        string buffer;
        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
        StreamReader sr = new StreamReader(fs, true);
        StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
        sw.AutoFlush = true;
 
        while ((buffer = sr.ReadLine()) != null)
        {
            for (int i = 0; i < keys.Length; i++)
            {
                ipos = 0;
                do
                {
                    ipos = buffer.IndexOf("<" + keys[i] + ">", ipos);
                    if (ipos != -1)
                    {
                        sw.BaseStream.Seek(ipos, SeekOrigin.Current);
                        sw.Write(values[i]);
                        ipos++;
                    }
                } while (ipos != -1);
            }
        }
        sw.Close();
        sr.Close();
        fs.Close();
    }
}
Les problèmes sont simples:
  1. ça fonctionne pas, ça ne modifie pas le fichier.
  2. si ça fonctionnait, y'auriez t'il pas des problèmes d'écrasement (et pas de remplacement propre) dû au couple Seek/Write
    1. le couple Seek/Write est t'il bon dans ce cas? (je pense pas)
  3. l'encodage du fichier n'est pas géré
    1. le couple Seek/Write est t'il envisable dans ce cas?
    2. voir plus avec un MemoryStream pour faire une édition en Hexadécimal directement?


Voilà, si vous avez des idées, tout est le bienvenu, je vous remerci d'avance.