2014-01-30 4 views
1

Я просто хочу, чтобы объединить все текстовые файлы в данном каталоге, подобно следующей командной строке команду:Слияние нескольких текстовых файлов - StreamWriter не пишет один файл?

cd $directory 
copy * result.txt 

я написал следующий код, который практически выполняет то, что я хочу, но он делает что-то странное , Когда StreamWriter записывает первый файл (или когда i = 0), он фактически не пишет никакого содержимого - размер файла остается 0 байтами, несмотря на то, что первый файл составляет ~ 300 КБ. Однако другой файл записывается успешно.

Если я сравню вывод из командной строки с выходом кода C# в diff, вы увидите, что отсутствует большой блок текста. Кроме того, результат командной строки составляет 1,044 КБ, где результат C# составляет 700 КБ.

string[] txtFiles = Directory.GetFiles(filepath); 
using (StreamWriter writer = new StreamWriter(filepath + "result.txt")) 
{ 
    for (int i = 0; i < txtFiles.Length; i++) 
    { 
     using (StreamReader reader = File.OpenText(txtFiles[i])) 
     { 
      writer.Write(reader.ReadToEnd()); 
     } 
    } 
} 

Am Я с помощью StreamWriter/StreamReader неверно?

ответ

1

Здесь, надеюсь, это поможет вам. Примечание. При копировании из потока в другой вы сохраняете некоторый баран и значительно улучшаете производительность.

class Program 
{ 
    static void Main(string[] args) 
    { 
     string filePath = @"C:\Users\FunkyName\Desktop"; 
     string[] txtFiles = Directory.GetFiles(filePath, "*.txt"); 

     using (Stream stream = File.Open(Path.Combine(filePath, "result.txt"), FileMode.OpenOrCreate)) 
     { 
      for (int i = 0; i < txtFiles.Length; i++) 
      { 
       string fileName = txtFiles[i]; 
       try 
       { 
        using (Stream fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read)) 
        { 
         fileStream.CopyTo(stream); 
        } 
       } 
       catch (IOException e) 
       { 
        // Handle file open exception 
       } 
      } 
     } 
    } 
} 
+0

'FileMode.OpenOrCreate' добавит все файлы во второй раз в выходной файл, когда программа снова запустится в том же каталоге. Скорее используйте 'FileMode.Create', чтобы полностью перезаписать его или' FileMode.CreateNew', чтобы получить исключение, когда оно уже существует. – Herdo

+0

@Herdo Программа удаляет любую существующую папку, соответствующую переменной 'filePath' до запуска, поэтому эта реализация должна быть в порядке. Спасибо! – TimeBomb006

1

Минималистичной реализация, чтение байт и запись их вместо того, чтобы использовать поток для чтения - пожалуйста, обратите внимание, что вы должны обрабатывать IOException правильно, чтобы избежать проступка:

var newline = Encoding.ASCII.GetBytes(Environment.NewLine); 
var files = Directory.GetFiles(filepath); 
try 
{ 
    using (var writer = File.Open(Path.Combine(filepath, "result.txt"), FileMode.Create)) 
     foreach (var text in files.Select(File.ReadAllBytes)) 
     { 
      writer.Write(text, 0, text.Length); 
      writer.Write(newline, 0, newline.Length); 
     } 
} 
catch (IOException) 
{ 
    // File might be used by different process or you have insufficient permissions 
} 
0

Я написал код, он работает правильно! изменить только строку:

using (StreamWriter writer = new StreamWriter(filepath + "result.txt")) 

к:

using (StreamWriter writer = new StreamWriter(filepath + "/result.txt")) 

я думаю, вы не можете увидеть файл, так как он будет сохранен в другой папке.

Смежные вопросы