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

时间:2018-07-20 14:20:07

标签: 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);
}

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

使用Github Desktop或SourceTree之类的程序会显示以下更改:

Github桌面

Github Desktop Screenshot

源树

Sourcetree Screenshot

感谢您提供任何提示或想法。非常感谢。 :)

2 个答案:

答案 0 :(得分:4)

此字符是{{3}}(BOM)前同步码,它是由WriteAllText方法自动添加的。

如果要编写不带BOM的文件,则必须创建自定义编码:

Encoding utf8NoBom = new UTF8Encoding(false);

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

File.WriteAllText(fileName, fileText, utf8NoBom);

答案 1 :(得分:2)

由于@Amy的评论,我设法确定了问题所在。 我以为我的所有文件都编码为UTF-8,但事实并非如此。

使用指定的答案here,我能够识别文件的编码,并在从文件中读取文件/向文件中写入文件时使用编码。

我的代码现在看起来像这样(使用this answer中指定的“ GetEncoding”方法):

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

foreach (string file in files)
{
    Encoding fileEncoding = GetEncoding(fileName);
    string fileText = File.ReadAllText(fileName, fileEncoding);
    string newText = fileText.Replace("hello", "goodbye");
    File.WriteAllText(fileName, newText, fileEncoding);
}