C# - 检查文件是否基于文本

Sev*_*Sev 12 c# file-io

如何使用FileStream测试我在C#中打开的文件是否是"文本类型"文件?我希望我的程序打开任何基于文本的文件,例如.txt,.html等.

但不要打开.doc或.pdf或.exe等等.

Ric*_*ard 10

一般来说:没有办法说出来.

如果您使用8位编码打开文本文件,则以UTF-16格式存储的文本文件可能看起来像二进制文件.同样有人可以将文本文件保存为.doc(它是文档).

虽然您可以打开文件并查看一些内容,但所有这些启发式方法有时会失败(例如,记事本会尝试这样做,通过仔细选择几个字符记事本会猜错并显示完全不同的内容).

如果你有一个特定的场景,而不是能够打开和处理任何东西,你应该能够做得更好.


byt*_*dev 8

正如其他人指出的那样,没有绝对的方法可以确定。然而,为了确定文件是否是二进制文件(可以说比确定文件是否是文本更容易),一些实现会检查连续的 NUL 字符。Git 显然只是检查前 8000 个字符是否为 NUL,如果发现则将该文件视为二进制文件。请参阅此处了解更多详细信息。

这是我编写的一个类似的 C# 解决方案,用于查找给定数量的所需连续 NUL。如果IsBinary返回 false,那么您的文件很可能是基于文本的。

public bool IsBinary(string filePath, int requiredConsecutiveNul = 1)
{
    const int charsToCheck = 8000;
    const char nulChar = '\0';

    int nulCount = 0;

    using (var streamReader = new StreamReader(filePath))
    {
        for (var i = 0; i < charsToCheck; i++)
        {
            if (streamReader.EndOfStream)
                return false;

            if ((char) streamReader.Read() == nulChar)
            {
                nulCount++;

                if (nulCount >= requiredConsecutiveNul)
                    return true;
            }
            else
            {
                nulCount = 0;
            }
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)


Guy*_*Guy 6

我想你可以检查前1000个(任意数字)字符,看看是否有不可打印的字符,或者它们是否都在某个范围内的ascii.如果是后者,假设它是文本?

无论你做什么都是猜测.

  • 更新:如今,文本文件更可能是 UTF-8,或类似的 Unicode 字符编码。寻找更新的答案。例如,了解 Notepad++ 如何确定文件是文本。 (3认同)