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

标签 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

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

最佳答案

这个字符是Unicode Byte Order Mark (BOM) 序言,由WriteAllText 方法自动添加。

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

Encoding utf8NoBom = new UTF8Encoding(false);

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

File.WriteAllText(fileName, fileText, utf8NoBom);

关于c# - File.WriteAllText 正在根据 Git 更改我的文件的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51444622/

相关文章:

c# - 使用 graph# 的 WPF 中的图形未绘制为链

c# - 将字符添加/删除到字符串开头的最有效方法?

java - TeamCity + git-teamcity 插件 : ParseException

Git reflog 一个特定的分支?

Git: merge 结构非常不同的分支

javascript - ASP MVC 6 AJAX 错误请求

c# - 为什么我不能在 C# 中编写从基类到派生类的隐式运算符?

git - 如何将 Accurev 导出到另一个 VCS?

git - 自定义 git "bang"别名的 Zsh 完成 - Git 分支名称

c# - Resharper:可能对标有 notnull 属性的实体进行空分配