检测文件是否包含文本

时间:2011-11-30 07:08:59

标签: c# file-encodings

  

可能重复:
  How can I determine if a file is binary or text in c#?
  C# - Check if File is Text Based

为了更好地理解多线程和异步任务,我在C#中编写了一个简单的应用程序来计算项目(目录)中代码行的总数。

目前,我打开一个文件并计算每个文件中的行数。但是,这包括所有文件(jpg,png,exe等)。有没有办法可以检测文件是否是文本文件?可能通过检测ASCII编码或类似的东西。

3 个答案:

答案 0 :(得分:2)

通常,您无法可靠地检测文件是否为文本文件。它从一般问题开始,实际上是“文本文件”。您已经暗示了编码,但尤其是那些cannot be reliably detected(例如,请参阅Notepad's struggle)。

话虽如此,您可以使用启发式方法做到最好(包括但当然不限于文件扩展名;排除众所周知的非文件类型,如EXE,DLL,ZIP,图像文件,{ {3}};可能与recognizing their signature或记事本使用的方法结合使用。

根据您的应用程序,我认为让用户选择要扫描的文件(可能包含默认的扩展名列表,如* .cs,* .txt,* .resx)是非常可行的。 ,* .xml,...)。如果文件(类型)/扩展名不在默认列表中且未由用户添加,则不会对其进行计数。如果用户将文件类型/扩展名添加到不是“文本文件”的列表中,则结果无效。

但是比较努力和自动结果从不 100%准确(检测所有可能的文件)这一事实应该是足够好的。

答案 1 :(得分:1)

如果您真的想要考虑它是二进制还是文本,那么测试JPG,PNG,EXE会很昂贵。对于JPG,您必须运行一些JPEG算法,这适用于PNG。而对于EXE则会有所不同。

一种测试二进制文件中零字节的方法,人们通常会考虑文件零字节数的节流百分比。

我的建议是仅依靠延期。如果文本文件将以.JPG / .PNG / .EXE扩展名命名,那么可以忽略不计。

请参阅此file list extension并列出文本文件扩展名,例如.txt,.log,.html,.php,.asp等。

答案 2 :(得分:0)

FWIW,Internet Explorer(Windows中的iow)中有一个名为MLang的lib,它具有编码检测功能。您可以使用它来简单地检测文件是文本还是二进制文件。

这是一个优秀的C#包装器:

http://www.codeproject.com/KB/recipes/DetectEncoding.aspx

那就是说,其他人建议使用文件扩展名列表(也许是签名列表)就足够了。

相关问题