скопировать текстовый файл - PullRequest
2 голосов
/ 29 апреля 2010

Я пытаюсь скопировать текстовый файл в другой текстовый файл построчно. Кажется, что есть буфер из 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 ]

6 голосов
/ 29 апреля 2010

Два выпуска:

  1. Ваши классы FileStream, StreamWriter и StreamReader должны быть внутри блоков using { }. Они реализуют IDisposable, поэтому вам нужно позвонить Dispose, и блок using сделает это за вас. Если вы сделаете это, это все, что вам нужно исправить (я объясню через минуту). Это также означает, что вам больше не нужно звонить Close().
  2. Как минимум, позвоните mdi_line.Flush(), прежде чем закрыть его. Это приведет к немедленной записи в файл буфера.

Вызов 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);
                //} 
            }
        }
    }
}
2 голосов
/ 29 апреля 2010

Вы знаете, что существует File.Copy () -метод? И FileInfo также имеет метод Copy () .
Редактировать: Я вижу, вы хотите изменить содержимое файла во время копирования, хотя это закомментировано правильно.

Для использования StreamReader вы можете взглянуть на документацию msdn . Он предлагает реализацию без 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);
      }
 }
1 голос
/ 29 апреля 2010

вы захотите:

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

см .: http://msdn.microsoft.com/en-us/library/system.io.streamreader.peek.aspx

0 голосов
/ 29 апреля 2010

Как насчет просто создать буфер самостоятельно и apt.ReadBlock () в буфер. Затем разделите \ r \ n буферизованного содержимого, обработайте строки в вашем массиве разбиения. Не обрабатывайте последнюю строку в вашем разделенном буфере, добавьте ее перед следующим ReadBlock, повторите промывку.

0 голосов
/ 29 апреля 2010

Вы можете прочитать файл, используя метод ReadLine () , например:

using (StreamReader sr = new StreamReader(inputFile)) 
{
    String line;
    while ((line = sr.ReadLine()) != null) 
    {
       // process line
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...