2010-04-29 72 views
2

我想在另一個文本文件中逐行復制文本文件。似乎有一個1024個字符的緩衝區。如果我的文件中少於1024個字符,我的函數將不會複製到另一個文件中。複製一個文本文件

此外,如果有超過1024個字符但少於1024個因子,這些超出的字符將不會被複制。

例如:在初始文件

2048字符 - 2048在初始文件複製

988字符 - 0複製

1256字符的初始文件 - 1024複製

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_Click(...)'... oof。 ;) – 2010-04-29 19:37:14

回答

6

兩個問題:

  1. FileStreamStreamWriterStreamReader類應該在之內座。他們實施IDisposable,所以你需要呼籲Dispose,而using塊會爲你做到這一點。如果你這樣做,那實際上就是你必須解決的問題(我將在一分鐘內解釋)。這樣做也意味着您不再需要致電Close()
  2. 在關閉它之前,請致電mdi_line.Flush()。這將導致緩衝區立即寫入文件。

StreamWriter類autmatically調用Dispose調用Flush,這就是爲什麼using塊將解決這個問題。

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()很棒! Thkx! – user90714 2010-04-29 19:49:11

+2

@melt:它會工作,但你真的應該使用像我描繪的使用塊。您應該只需將該代碼複製並粘貼到您的應用程序中即可替代該應用程序。 – 2010-04-29 19:50:06

2

你知道,有一個File.Copy() -method?和FileInfo has a Copy()-方法。
編輯:我看到你想修改複製過程中的文件內容,雖然現在已經註釋掉了。

有關StreamReader的用法,您可以查看msdn documentation。這表明沒有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

看起來他正在對每一行進行一些處理,因爲他複製了它。 – 2010-04-29 19:42:22

+0

中,似乎目標是逐行讀取文件,並在將每行寫入輸出文件之前對其進行修改。 – M4N 2010-04-29 19:42:34

+0

@Shane,@Martin:謝謝你指出 - 你可能是對的,我的回答在他的情況下不會幫助 – tanascius 2010-04-29 19:44:12

0

你可以使用ReadLine() method這樣讀取文件:

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

這與他的問題無關。 – 2010-04-29 19:48:45

0

如何只緩衝對自己和apt.ReadBlock()到緩衝區。然後在緩衝內容上分割\ r \ n,處理分割數組中的行。不要處理分割緩衝區中的最後一行,將它加到下一個ReadBlock,重複沖洗。

相關問題