如何使用其内容知道文件是txt还是二进制文件?

时间:2011-01-21 13:57:05

标签: c#

  

可能重复:
  How can I determine if a file is binary or text in c#?

如果不考虑文件名(扩展名),只使用内容,我们需要知道文件是文本还是二进制文件。我不能使用扩展名,因为我不知道所有文本文件扩展名,因为文本文件可以没有扩展名。

我这样做是为了寻找文件第一部分中非-ASCII字节的百分比。由于性能原因,我无法每次都读取完整的文件。我使用以下代码:

private static bool IsBinary(byte[] bytes, int maxLength)
{
    int len = maxLength > 1024 ? 1024 : maxLength;

    int nonASCIIcount = 0;

    for( int i = 0; i < len; ++i )
        if( bytes[i] > 127 )
            ++nonASCIIcount;

    // if the number of non ASCII is more than a 30%
    // then is a binary file. 
    return (nonASCIIcount / len) > 0.3;
}

问题是某些类型的文件被错误地检测为文本,因为文件的第一部分是像photoshop文件一样的文本。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你不能说它是基于百分比的文字。唯一的方法是检查ANYTHING是否为非ASCII,如果是,则将其视为二进制。所以你的代码应该是:

bool IsBinary()
{
  for (int i = 0; i < bytes.Length; i++ )
    if (bytes[i] > 127)
      return true;
  return false;
}

编辑:此外,如果您可以使用,则可能应该查看MIME类型的文件。

答案 1 :(得分:0)

这取决于整个文件的内容和可能的文本编码,其他任何东西都不可靠。此外,对于纯ASCII文件,您不应该检查&gt; 127而是&lt; 32(0x20)并且不等于0x0a或0x0d(换行和回车)。 如果编码可能是UTF8则更复杂,尝试以UTF8的形式读取它可能会有效,如果失败,则假装它是二进制的。

答案 2 :(得分:-1)

您不希望将“控制字符”包含为文本数据。文本文件永远不会包含ascii代码小于32的字符。