我有一个非常简单的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桌面
源树
感谢您提供任何提示或想法。非常感谢。 :)
答案 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);
}