C#如何合并多个文件为一个?遍历目录代码仅读取单文件求解
代码问题分析
原代码有两处核心逻辑错误,直接导致功能不符合预期:
- 写入逻辑错误:
File.WriteAllText是覆盖式写入,每次调用都会先清空目标文件的全部原有内容,再写入本次传入的内容。循环过程中每执行一次写入,之前保存的所有内容都会被清除,最终只会留下最后一次写入的内容。 - 读取逻辑错误:
File.ReadAllText(file)的返回值是包含整个文件内容的单个字符串,对字符串做foreach遍历,每次拿到的元素是单个char类型字符,不是整行或整个文件的内容。你观察到的“仅能读取到一个文件”是表象,实际最终输出文件里只会保留最后一个遍历到的文件的最后一个字符。
修改方案
根据待合并的文件总体积,选择对应实现即可:
小文件场景(总文件体积不大,内存足够承载)
用StringBuilder拼接所有内容后一次性写入,代码简洁易维护:
using System.Text; // 配置参数 string targetDirectory = "替换为你要读取的目录实际路径"; string outputFile = @"D:\ee.txt"; StringBuilder mergedContent = new StringBuilder(); // 遍历目录下所有文件,如果要包含子目录,给GetFiles加第三个参数SearchOption.AllDirectories foreach (string filePath in Directory.GetFiles(targetDirectory, "*.*")) { // 读取单个文件全部内容追加到拼接器 mergedContent.Append(File.ReadAllText(filePath)); // 如果需要不同文件的内容之间加空行分隔,取消注释下一行 // mergedContent.AppendLine(); } // 所有内容拼接完成后一次性写入目标文件 File.WriteAllText(outputFile, mergedContent.ToString());
大文件场景(总文件体积大,避免一次性占满内存)
用流追加的方式逐文件复制,不需要把所有内容加载到内存,运行更稳定:
// 配置参数 string targetDirectory = "替换为你要读取的目录实际路径"; string outputFile = @"D:\ee.txt"; // 先删除已存在的输出文件,避免残留上次运行的旧内容 if (File.Exists(outputFile)) { File.Delete(outputFile); } foreach (string filePath in Directory.GetFiles(targetDirectory, "*.*")) { // 打开当前文件的读流,以追加模式打开输出文件的写流,直接复制流内容 using (FileStream readStream = File.OpenRead(filePath)) using (FileStream writeStream = File.Open(outputFile, FileMode.Append, FileAccess.Write)) { readStream.CopyTo(writeStream); } // 如果需要不同文件的内容之间加空行分隔,取消注释下一行 // File.AppendAllText(outputFile, Environment.NewLine); }
补充说明
- 如果只需要合并特定类型的文件,把
Directory.GetFiles里的通配符*.*改成对应后缀即可,比如合并所有txt文件就用*.txt - 运行前确保程序对目标读取目录、输出文件所在目录有读写权限,否则会抛出权限异常
- 如果输出文件不想放在D盘根目录,修改
outputFile变量为你需要的路径即可
内容的提问来源于stack exchange,提问作者JOHN SMITH
相关产品推荐
相关产品推荐

