Объединение файлов в каталог с добавлением новой строки каждый раз


У меня есть куча txt-файлов в каталоге, которые я хочу объединить в один файл. В конце каждого файла я хочу добавить строку возврата каретки/ new.

Как лучше всего сделать это в c#?

4 2

4 ответа:

Однострочный, который, вероятно, довольно сильно зависит от потребления памяти:

File.WriteAllLines(
    targetFileName,
    Directory.GetFiles(srcFolder, "*.txt")
        .SelectMany(f=>
            File.ReadLines(f).Concat(new[] {Environment.NewLine})));

Надеюсь, вы сможете жить с дополнительной новой строкой в конце.

Я не буду писать код для вас, но я укажу вам правильное направление.

  • Использовать системы.ИО.Каталог.Заражен() метод для перебора файлов
  • Используйте StreamReader для чтения файлов в буфер, добавляя новую строку после каждого файла.
  • Используйте StreamWriter для записи буфера обратно в выходной файл.

Вот декларативный подход, использующий Directory.EnumerateFiles что хорошо работает для больших каталогов, потому что он передает имена файлов по мере их обнаружения.

var lines = from file in Directory.EnumerateFiles(directory, "*.txt")
            from line in File.ReadLines(file).Concat(new[]{Environment.NewLine})
            select line;
File.WriteAllLines(outputFileName, lines);

Преимущества этого подхода:

  • читаемый и легкий для понимания
  • Распараллеливаемые Если у вас много файлов (> 10000):

    Просто добавьте .AsParallel() в конец первой строки. Использование памяти, конечно, увеличится, но вы получите работу гораздо быстрее, особенно для сотни тысяч файлов.

Я тоже не пишу код для вас, но я использовал следующий код, чтобы сделать это, я помню, что файлы были названы 1.txt, 2.TXT и т. д так что я мог бы пролистать всю папку

    private void merge()
    {
        string[] fullFile = new string[152];
        System.IO.StreamWriter data = new System.IO.StreamWriter(filepath);
        for (int i = 1; i < 152; i++)
        {
            try
            {
                string fullfile = System.IO.File.ReadAllText(filepath);
                data.WriteLine(fullfile + "return\n");

            }
            catch { }
        }
        data.Close();

    }