Объединение файлов в каталог с добавлением новой строки каждый раз
У меня есть куча txt-файлов в каталоге, которые я хочу объединить в один файл. В конце каждого файла я хочу добавить строку возврата каретки/ new.
Как лучше всего сделать это в c#?
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(); }