VB2005 : ecrire à un endroit precis d'un txt ou ini

VB2005 : ecrire à un endroit precis d'un txt ou ini - VB/VBA/VBS - Programmation

Marsh Posté le 21-09-2008 à 11:19:14    

bonjour,
 
j'utilise visual 2005
 
je sais lire un fichier texte ou ini,
je sais ecrire dans ce meme fichier, mais uniquement en fin de fichier.
 
pouvez me dire comment faire pour remplacer ou ajouter une ligne de texte MAIS à un endroit precis du fichier svp ?
 
c'est pas faute d'avoir posé la question à mon amis google mais j'arrive pas à trouver exactement ça (ou je comprend pas les sources cause niveau debutant)
 
merci d'avance

Reply

Marsh Posté le 21-09-2008 à 11:19:14   

Reply

Marsh Posté le 21-09-2008 à 12:40:25    

Reply

Marsh Posté le 21-09-2008 à 13:48:16    


 
ok merci mais comme je le disais google j'ai deja essayé
plutot que des pages de liens à parcourir et que je ne comprend pas forcement,
je prefererai un exemple concret stp
 
lire un fichier txt ou autre je sais faire.
ce qui me bloque c'est ecrire à un endroit precis de ce fichier.  
 
j'ai bien vu des liens pour decouper le fichier par ligne avec split
mais pas la methode à utiliser pour dire, par exemple, que c'est à la ligne 23 precisement que je veux rajouter du texte
 
merci


Message édité par Profil supprimé le 21-09-2008 à 13:48:49
Reply

Marsh Posté le 21-09-2008 à 14:56:22    

Salut, si tu ne comprends déjà pas les exemples proposés par les liens ...

Reply

Marsh Posté le 21-09-2008 à 16:27:05    

kiki29 a écrit :

Salut, si tu ne comprends déjà pas les exemples proposés par les liens ...


 
1er exemple proposé : lecture d'un fichier ini alors que j'ai dis que je savais faire depuis le debut
 
autres exemples : des pages et des pages de liens google
 
si tu sais pas repondre plus precisement...

Reply

Marsh Posté le 21-09-2008 à 16:56:21    

pour le cas d'un ajout/ modification dans un fichier ini j'ai trouvé avec "WritePrivateProfileString"
 
mais pour le cas d'un txt je ne sais pas faire mieux que de le spliter pour avoir un tableau de ligne
 
donc si vous pouvez m'aider à coder l'insertion de texte sur le n° de ligne voulu merci d'avance
 
 

Reply

Marsh Posté le 21-09-2008 à 22:22:50    

Salut.
 
Voici un exemple en C#. Tu n'as plus qu'à le traduire en VB.NET, puisque ce sont les mêmes objets/méthodes.
 
C'est pas forcément la méthode la plus courte ni la plus simple, mais la plus claire parmi celles qui permettent de manipuler de gros fichiers.
 
Les ReadToEnd(), non merci, quand tu modifies un fichier qui fait 800 Mo moi ça me gêne un peu ;)
 
Ici on traîte donc ligne par ligne, et on en profite pour faire un backup.
 

Code :
  1. using System;
  2. using System.IO;
  3. using System.Windows.Forms;
  4.  
  5. namespace SandBox
  6. {
  7.    public partial class Form1 : Form
  8.    {
  9.        const string FILENAME = @"c:\in\exemple.ini";
  10.        public Form1()
  11.        {
  12.            InitializeComponent();
  13.            LoadFile();
  14.        }
  15.  
  16.        private void button1_Click(object sender, EventArgs e)
  17.        {
  18.            int selected = listBox1.SelectedIndex;
  19.            int current = 0;
  20.            string tmpFileName = Path.GetTempFileName();
  21.  
  22.            TextReader tr = new StreamReader(FILENAME);
  23.            TextWriter tw = new StreamWriter(tmpFileName);
  24.  
  25.            FileInfo f = new FileInfo(FILENAME);
  26.            
  27.            while (tr.Peek() > 0)
  28.            {
  29.                if (current++ == selected)
  30.                {
  31.                    tw.WriteLine(textBox1.Text);
  32.                }
  33.                tw.WriteLine(tr.ReadLine());
  34.            }
  35.            tr.Close();
  36.            tr.Dispose();
  37.            tw.Flush();
  38.            tw.Close();
  39.            tw.Dispose();
  40.            File.Replace(tmpFileName, FILENAME, string.Format("{0}.old", FILENAME));
  41.  
  42.            LoadFile();
  43.        }
  44.  
  45.        private void LoadFile()
  46.        {
  47.            int selected = listBox1.SelectedIndex;
  48.  
  49.            TextReader tr = null;
  50.            try
  51.            {
  52.                tr = new StreamReader(FILENAME);
  53.            }
  54.            catch (FileNotFoundException e)
  55.            {
  56.                // Fichier inexistant, on ne fait rien
  57.            }
  58.            finally
  59.            {
  60.                if (tr != null)
  61.                {
  62.                    listBox1.Items.Clear();
  63.  
  64.                    while (tr.Peek() > 0)
  65.                    {
  66.                        listBox1.Items.Add(tr.ReadLine());
  67.                    }
  68.  
  69.                    tr.Close();
  70.                    listBox1.SelectedIndex = selected;
  71.                }
  72.            }
  73.        }
  74.    }
  75. }


 
Et on split pas pour lire un fichier texte, on n'est pas en train de faire du PHP là...

Message cité 1 fois
Message édité par MagicBuzz le 21-09-2008 à 22:26:16
Reply

Marsh Posté le 21-09-2008 à 22:29:14    

Une méthode plus performante pourrait passer non pas par des TextReader/TextWriter, mais des accès binaires bufferés avec genre un buffer de la taille d'un cluster disque à chaque lecture/écriture, et isoler les valeurs 13 pour retrouver les sauts de lignes dans le buffer. Ca éviterait de se taper des conversions en string inutile, mais c'est clairement plus chiant à écrire et débugger.
 
Ceci dit, les TexReader/TextWriter ne font pas un accès disque à chaque ReadLine/WriteLine, ils gèrent déjà ça pour nous, donc c'est se prendre la tête pour un gain certainement non significatif.


Message édité par MagicBuzz le 21-09-2008 à 22:35:06
Reply

Marsh Posté le 24-09-2008 à 13:55:39    

MagicBuzz a écrit :

Salut.
 
Voici un exemple en C#. Tu n'as plus qu'à le traduire en VB.NET, puisque ce sont les mêmes objets/méthodes.
 
C'est pas forcément la méthode la plus courte ni la plus simple, mais la plus claire parmi celles qui permettent de manipuler de gros fichiers.
 
Les ReadToEnd(), non merci, quand tu modifies un fichier qui fait 800 Mo moi ça me gêne un peu ;)
 
Ici on traîte donc ligne par ligne, et on en profite pour faire un backup.
 
 
Et on split pas pour lire un fichier texte, on n'est pas en train de faire du PHP là...


 
 
(avec un peu de retard..)  merci pour le code  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed