File.WriteAllText 正在根据 Git 更改我的文件的开头

Jam*_*ner 4 c# git

我有一个非常简单的 C# 程序,它迭代多个文件并替换所有文件中的字符串。

然而,当我使用 Git 比较这些文件时,它突出显示了我所有文件的更改。

我的 C# 代码是:

string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);

foreach (string file in files)
{
    string fileText = File.ReadAllText(fileName, Encoding.UTF8);
    string newText = fileText.Replace("hello", "goodbye");
    File.WriteAllText(fileName, newText, Encoding.UTF8);
}
Run Code Online (Sandbox Code Playgroud)

就我而言,这看起来不错。但是,当我运行该程序并git status在存储库上执行时,我发现每个文件都有差异。

使用 Github Desktop 或 SourceTree 等程序会带来以下变化:

Github 桌面

Github 桌面截图

源树

源树截图

感谢您提供任何人可能有的提示或想法。他们非常感激。:)

Mar*_*und 6

该字符是Unicode 字节顺序标记(BOM) 前导码,由该WriteAllText方法自动添加。

如果你想写入没有BOM的文件,你必须创建自定义编码:

Encoding utf8NoBom = new UTF8Encoding(false);
Run Code Online (Sandbox Code Playgroud)

然后将该实例作为该WriteAllLines方法的第三个参数传递:

File.WriteAllText(fileName, fileText, utf8NoBom);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,(至少)[mscorlib .Net 4.7.1](https://learn.microsoft.com/en-us/dotnet/api/system.io.file.writealltext?view=netframework-4.7.1 #System_IO_File_WriteAllText_System_String_System_String_) 默认编码为 UTF-8 without BOM(见备注)。如果您浏览*参考源*,您会发现 MS 也将其他内容的默认编码更改为没有 BOM 的 UTF-8(即“StreamWriter”)。 (3认同)