复制文本文件

时间:2010-04-29 19:35:31

标签: c# .net file text

我正在尝试逐行复制其他文本文件中的文本文件。似乎有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();
}

5 个答案:

答案 0 :(得分:6)

两个问题:

  1. 您的FileStreamStreamWriterStreamReader类应位于using { }块内。他们实施IDisposable,因此您需要调用Dispose,而using块会为您执行此操作。如果你这样做,那就是你必须解决的问题(我将在一分钟内解释)。这样做也意味着您不再需要致电Close()
  2. 至少在关闭之前致电mdi_line.Flush()。这将导致缓冲区立即写入文件。
  3. Dispose班级上呼叫StreamWriter会自动调用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);
                    //} 
                }
            }
        }
    }
    

答案 1 :(得分:2)

你知道,有File.Copy() - 方法吗?而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);
      }
 }

答案 2 :(得分:1)

你想要的:

using (StreamReader apt= new StreamReader(apt_file)) 
{
    while (apt.Peek() > -1){ ...}
 }

请参阅:http://msdn.microsoft.com/en-us/library/system.io.streamreader.peek.aspx

答案 3 :(得分:0)

您可以使用ReadLine() method这样读取文件:

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

答案 4 :(得分:0)

如何将缓冲区自己和apt.ReadBlock()放入缓冲区。然后拆分缓冲内容上的\ r \ n,处理拆分数组中的行。不要处理分割缓冲区中的最后一行,将其添加到下一个ReadBlock,重复冲洗。