可能重复:
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编码或类似的东西。
答案 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
那就是说,其他人建议使用文件扩展名列表(也许是签名列表)就足够了。