1

可能重复:
如何确定文件是 C# 中的二进制文件还是文本文件?
C# - 检查文件是否基于文本

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

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

4

3 回答 3

2

通常,您无法可靠地检测文件是否为文本文件。它从一般问题开始,实际上是“文本文件”。您已经暗示过编码,但尤其是那些无法可靠检测到的编码(例如,请参阅记事本的斗争)。

话虽如此,您也许可以使用启发式方法来做到最好(包括但当然不限于文件扩展名;通过识别它们的签名,排除众所周知的非文件类型,如 EXE、DLL、ZIP、图像文件;可能与浏览器或记事本使用的方法结合使用)。

根据您的应用程序,我想让用户选择要扫描的文件是非常可行的(可能有一个默认的扩展名列表,如 *.cs、*.txt、*.resx、*. xml,...)。如果文件(类型)/扩展名不在默认列表中并且不是用户添加的,则不计算在内。如果用户将文件类型/扩展名添加到不是“文本文件”的列表中,则结果没有用处。

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

于 2011-11-30T07:20:44.257 回答
1

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

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

我的建议是仅依靠扩展。文本文件将以 .JPG/.PNG/.EXE 扩展名命名的情况非常微不足道。

请查看此文件列表扩展名并列出文本文件扩展名,如 .txt、.log、.html、.php、.asp 等。

于 2011-11-30T07:21:02.150 回答
0

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

这是一个出色的 C# 包装器:

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

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

于 2011-11-30T07:33:28.213 回答