【问题标题】:WriteAllText method returns the last row, instead of the entire rows of the fileWriteAllText 方法返回最后一行,而不是文件的整行
【发布时间】:2020-06-29 09:20:07
【问题描述】:

我有一个代码:

  • 读取文本文件,
  • 用“;”替换所有“空格”,
  • 删除重复的字符“;”
  • 并保存包含所有更改的新文件。

但不是写入文件中的所有行,而是只写入最后一行。

static void Main(string[] args)
    {
        RegexOptions options = RegexOptions.None;
        Regex regex = new Regex("[ ]{2,}", options);
        
        string FilePath = @"C:\Users\User\Desktop\download1.txt";
        string OutputhFilePath = @"C:\Users\User\Desktop\download2.txt";

        List<string> lines = new List<string>();
        lines = File.ReadAllLines(FilePath).ToList();
        
        foreach (string line in lines)
        {
            string line1 =  line.Replace(' ', ';');
            line1 = regex.Replace(line, ";");
            Console.WriteLine(line1);
            File.WriteAllText(OutputhFilePath, line1);
        }
        
            Console.ReadLine();
    }

有人可以帮我解决这些问题吗?提前致谢!

【问题讨论】:

标签: c# text text-files writealltext


【解决方案1】:

File.WriteAllText Method 这样做:

创建一个新文件,将内容写入文件,然后关闭 文件。如果目标文件已经存在,则覆盖。

所以您在读取的每一行中覆盖文件...您可以使用StringBuilder 来执行此操作:

static void Main(string[] args)
{
    RegexOptions options = RegexOptions.None;
    Regex regex = new Regex("[ ]{2,}", options);
    
    string FilePath = @"C:\Users\User\Desktop\download1.txt";
    string OutputhFilePath = @"C:\Users\User\Desktop\download2.txt";

    List<string> lines = new List<string>();
    lines = File.ReadAllLines(FilePath).ToList();
    var sb = new StringBuilder();

    foreach (string line in lines)
    {
        string line1 =  line.Replace(' ', ';');
        line1 = regex.Replace(line, ";");
        Console.WriteLine(line1);
        sb.AppendLine(line1);
    }
    
    File.WriteAllText(OutputhFilePath, sb.ToString());
    Console.ReadLine();
}

【讨论】:

  • sb.WriteLine (line1) 应该是 - sb.AppendLine (line1),但其余的工作。谢谢!
【解决方案2】:

你需要File.AppendAllText()

您正在用新的一行覆盖之前的每一行,这就是为什么您只看到最后一个输入行。

【讨论】:

    【解决方案3】:

    问题是您在每一行之后输出到文件。 File.WriteAllText 所做的是它总是用最新的数据覆盖目标文件。您需要的是附加到文件中。例如尝试File.AppendText method

    然而更好的解决方案是使用StringBuilder,将所有行附加到它,然后一次输出整个内容(builder.ToString())。这样可以避免在每一行之后过度打开和关闭文件。

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2022-07-15
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多