如何检测文件是否具有 Unix 换行符 () 或 Windows 换行符 ( )
本文关键字:换行符 Unix Windows 文件 何检测 检测 是否 | 更新日期: 2024-10-26 06:18:15
我正在通过FileStream更改文件(这是一个非常大的文件,我只需要更改标题而无需重写整个内容。
该文件可以具有Unix或Windows换行符,知道哪个对我来说很重要,这样我就可以在更新文件时将正确的换行符写回文件中。
我可以编写一个简单的函数来使用 FileStream 以块的形式读取文件并检查换行符。
但是这个问题之前一定已经解决了,如果不是在 C# 中,那么在 Win32 API 中?
检测文件换行样式的最有效方法是什么?
谢谢大家的建议。我很惊讶没有找到容易重用的东西,所以我创建了一个简单的函数,我包含在这里。请注意,它只查找第一个换行符(' 或 ''r')并将其作为匹配项返回。足以满足我的需求,但也许不强大。
public bool TryDetectNewLine(string path, out string newLine)
{
using (var fileStream = File.OpenRead(path))
{
char prevChar = ''0';
// Read the first 4000 characters to try and find a newline
for (int i = 0; i < 4000; i++)
{
int b;
if ((b = fileStream.ReadByte()) == -1) break;
char curChar = (char)b;
if (curChar == ''n')
{
newLine = prevChar == ''r' ? "'r'n" : "'n";
return true;
}
prevChar = curChar;
}
// Returning false means could not determine linefeed convention
newLine = Environment.NewLine;
return false;
}
}
正如 Per 所说,如果不打开文本文件并通过字节流式传输,实际上没有办法减少文本文件的内容。如果您使用 http 下载文件,您可能会很幸运,您可以获得指示文件类型的 mime 类型,但大多数情况下它只是"八位字节流"。
虽然您可以暴力破解它,并读取直到找到换行符("'"),然后备份一个字符并查看是否有回车符("''r"),但我会采取更静态的方法,因为您必须以任何方式读取数据。
1) 选择要读取的字节样本大小,该样本大小应从文件中获取至少 2 或 3 条记录。
2)将每个字节遭遇(此处设置的单字节字符)存储为直方图。您可以通过将计数存储在按字节值索引的arry中来执行此操作,也可以使用字典。
3) 查看回车符和换行值计数。如果您有换行计数并且没有回车符,则它是一个 unix 文件。如果回车和换行计数,则它是一个 Windows 文件。
这种方法还允许您对入站文件进行质量检查。您的直方图中是否有不是 aplha 数字的字符?然后有人给你传递了一个二进制文件。期待所有大写?然后查找大写字符之外的计数。您可以执行许多检查来防止处理非文本文件。
我认为没有办法 100% 确定它是 Unix 还是 DOS 文件,因为大多数编辑器在打开/保存时不会更正带有"错误"结尾的文件。
我会将文件作为流读取并搜索"''r'"并且仅搜索"'"的出现
对搜索结果使用简单的统计分析(即哪一个的命中数最高)可能会给你正确的答案。如果文件很大,那么读取文件的第一个 X% 就足够了。
更简单的解决方案当然是只搜索"''r'",如果找到,则假定它是一个DOS文件。如果文件是机器生成的,则这应该工作到 100%。
至于.NET Framework/WinAPI中的任何现有代码,我还没有看到任何执行此操作的代码。