2010-04-29 8 views
2

J'essaie de copier un fichier texte dans un autre fichier texte ligne par ligne. Il semble qu'il y ait un tampon de 1024 caractères. S'il y a moins de 1024 caractères dans mon fichier, ma fonction ne sera pas copiée dans l'autre fichier.Copier un fichier texte

De plus, s'il y a plus de 1024 caractères mais moins un facteur de 1024, ces caractères de dépassement ne seront pas copiés.

Ex:

2048 caractères dans le fichier initial - 2048 copié

988 caractères dans le fichier initial - 0 copié

1256 caractère dans le fichier initial - 1024 copié

private void button3_Click(object sender, EventArgs e) 
{ 
    // écrire code pour reprendre le nom du fichier sélectionné et 
    //ajouter un suffix "_poly.txt" 
    string ma_ligne; 
    const int RMV_CARCT = 9; 

    //délcaration des fichier 
    FileStream apt_file = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read); 
    textBox1.Text = textBox1.Text.Replace(".txt", "_mod.txt"); 
    FileStream mdi_file = new FileStream(textBox1.Text, FileMode.OpenOrCreate,FileAccess.ReadWrite); 

    //lecture/ecriture des fichiers en question 
    StreamReader apt = new StreamReader(apt_file); 
    StreamWriter mdi_line = new StreamWriter(mdi_file, System.Text.Encoding.UTF8, 16); 



    while (apt.Peek() >= 0) 
    { 
     ma_ligne = apt.ReadLine(); 
     //if (ma_ligne.StartsWith("GOTO")) 
     //{ 
     // ma_ligne = ma_ligne.Remove(0, RMV_CARCT); 
     // ma_ligne = ma_ligne.Replace(" ",""); 
     // ma_ligne = ma_ligne.Replace(",", " "); 
     mdi_line.WriteLine(ma_ligne); 
     //} 
    } 
    apt_file.Close(); 
    mdi_file.Close(); 
} 
+0

'button3_Cliquez sur (...)' ... oof. ;) –

Répondre

6

Deux questions:

  1. Votre FileStream, StreamWriter et StreamReader les classes devrait être à l'intérieur using { } blocs. Ils implémentent IDisposable, donc vous devez appeler Dispose, et le bloc using le fera pour vous. Si vous faites cela, c'est tout ce que vous avez à réparer (ce que je vais vous expliquer dans une minute). Cela signifie également que vous n'avez plus besoin d'appeler Close().
  2. Au minimum, appelez mdi_line.Flush() avant de le fermer. Cela provoquera l'écriture du tampon dans le fichier immédiatement.

Appel Dispose sur la autmatically classe StreamWriter appelle Flush, ce qui explique pourquoi le bloc using corrigera le problème.

using (FileStream apt_file = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read)) 
{ 
    textBox1.Text = textBox1.Text.Replace(".txt", "_mod.txt"); 

    using (FileStream mdi_file = new FileStream(textBox1.Text, FileMode.OpenOrCreate, FileAccess.ReadWrite)) 
    { 
     //lecture/ecriture des fichiers en question 
     using (StreamReader apt = new StreamReader(apt_file)) 
     using (StreamWriter mdi_line = new StreamWriter(mdi_file, System.Text.Encoding.UTF8, 16)) 
     { 
      while (apt.Peek() >= 0) 
      { 
       ma_ligne = apt.ReadLine(); 
       //if (ma_ligne.StartsWith("GOTO")) 
       //{ 
       // ma_ligne = ma_ligne.Remove(0, RMV_CARCT); 
       // ma_ligne = ma_ligne.Replace(" ",""); 
       // ma_ligne = ma_ligne.Replace(",", " "); 
       mdi_line.WriteLine(ma_ligne); 
       //} 
      } 
     } 
    } 
} 
+0

mdi_lineFlush() fonctionne très bien !!! Thkx! – user90714

+2

@melt: Cela fonctionnera, mais vous devriez vraiment utiliser les blocs 'using' comme je l'ai représenté. Vous devriez juste pouvoir copier et coller ce code dans votre application en remplacement de ce qui existe. –

2

Vous savoir, qu'il existe un File.Copy() -method? Et FileInfo has a Copy() -method, aussi.
Editer: Je vois que vous voulez modifier le contenu du fichier pendant la copie, bien que ce soit commenté correctement, maintenant.

Pour une utilisation de StreamReader, vous pouvez regarder le msdn documentation. Il suggère une mise en œuvre sans Peek():

using (StreamReader sr = new StreamReader("TestFile.txt")) 
{ 
     string line; 
     // Read and display lines from the file until the end of 
     // the file is reached. 
     while ((line = sr.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 
} 
+0

Il semble qu'il effectue un traitement sur chaque ligne lorsqu'il le copie. –

+0

à partir du code commenté, il semble que l'objectif est de lire le fichier ligne par ligne et modifier chaque ligne avant qu'il ne soit écrit dans le fichier de sortie. – M4N

+0

@Shane, @Martin: Merci d'avoir souligné - vous avez probablement raison et ma réponse ne va pas aider dans son cas – tanascius

0

Vous pouvez lire le fichier en utilisant le ReadLine() method comme ceci:

using (StreamReader sr = new StreamReader(inputFile)) 
{ 
    String line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     // process line 
    } 
} 
+0

Cela n'a rien à voir avec son problème. –

0

Que diriez-vous du tampon seulement sur votre propre et apt.ReadBlock() dans le tampon. Puis scindez sur le contenu tamponné, traitez les lignes dans votre tableau divisé. Ne pas traiter la dernière ligne dans votre tampon divisé, préfixez-le au prochain ReadBlock, rincer répéter.

Questions connexes