如何检测文件是否具有 Unix 换行符 () 或 Windows 换行符 ( )

本文关键字:换行符 Unix Windows 文件 何检测 检测 是否 | 更新日期: 2024-10-26 06:18:15

我正在通过FileStream更改文件(这是一个非常大的文件,我只需要更改标题而无需重写整个内容。

该文件可以具有Unix或Windows换行符,知道哪个对我来说很重要,这样我就可以在更新文件时将正确的换行符写回文件中。

我可以编写一个简单的函数来使用 FileStream 以块的形式读取文件并检查换行符。

但是这个问题之前一定已经解决了,如果不是在 C# 中,那么在 Win32 API 中?

检测文件换行样式的最有效方法是什么?

如何检测文件是否具有 Unix 换行符 () 或 Windows 换行符 (
)

谢谢大家的建议。我很惊讶没有找到容易重用的东西,所以我创建了一个简单的函数,我包含在这里。请注意,它只查找第一个换行符(' 或 ''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中的任何现有代码,我还没有看到任何执行此操作的代码。