WriteAllText方法仅写入最后一行而非全部内容的问题求助
嘿,我一眼就瞅出问题所在啦——你的代码之所以只写入最后一行,全是File.WriteAllText搞的鬼!
问题根源
File.WriteAllText这个方法的特性是:每次调用都会创建新文件(如果不存在)或者直接覆盖已有文件的全部内容。你在循环里每处理一行就调用一次它,相当于前一行刚写完,下一行就把它覆盖掉了,到最后自然就只剩最后一行的结果啦。
另外还有个小细节:你先把空格替换成;得到了line1,但后面正则替换却用了原line,那前面的空格替换操作不就白做了嘛😅。
修正后的代码
我给你调整了一下,先把所有行处理完再一次性写入,既解决了覆盖问题,还提升了效率:
static void Main(string[] args) { RegexOptions options = RegexOptions.None; // 优化正则:直接匹配连续的空格或;,一步清除重复分隔符 Regex regex = new Regex(@"[ ;]{2,}", options); string FilePath = @"C:\Users\User\Desktop\download1.txt"; string OutputFilePath = @"C:\Users\User\Desktop\download2.txt"; // 修正了变量名的拼写错误 // 批量读取+处理所有行 var processedLines = File.ReadAllLines(FilePath) .Select(line => { // 先替换单个空格为; string replacedLine = line.Replace(' ', ';'); // 清除连续的重复分隔符 return regex.Replace(replacedLine, ";"); }) .ToList(); // 一次性写入所有处理后的行,避免覆盖 File.WriteAllLines(OutputFilePath, processedLines); // 打印结果验证 foreach (var line in processedLines) { Console.WriteLine(line); } Console.ReadLine(); }
可选方案(逐行写入)
如果你非要在循环里逐行写,也可以把File.WriteAllText换成File.AppendAllText,记得要加上换行符,不然所有内容会挤在一行:
// 循环里的替换代码 foreach (string line in lines) { string line1 = line.Replace(' ', ';'); line1 = regex.Replace(line1, ";"); // 这里要换成处理后的line1! Console.WriteLine(line1); File.AppendAllText(OutputFilePath, line1 + Environment.NewLine); }
不过还是更推荐批量处理的方式,因为频繁读写文件会影响性能,尤其是文件内容多的时候。
内容的提问来源于stack exchange,提问作者Alex27
相关产品推荐
相关产品推荐

