如何检查文件是否基于文本?

时间:2010-09-17 19:29:05

标签: file text encoding text-files

我正在开发一个小型文本替换应用程序,它基本上允许用户选择一个文件并替换它中的文本而无需打开文件本身。但是,我想确保该函数仅针对基于文本的文件运行。我想我可以通过检查文件的编码来实现这一点,但我发现Notepad .txt文件使用Unicode UTF-8编码,MS Paint .bmp文件也是如此。有没有一种简单的方法来检查这个,而不对文件扩展名本身施加限制?

6 个答案:

答案 0 :(得分:2)

除非你从某个地方得到一个巨大的暗示,否则你会陷入困境。纯粹通过检查字节有一个非零的概率,你会猜错,因为过多的编码(“ASCII”,Unicode,UTF-8,DBCS,MBCS等)。哦,如果第一页看起来像ASCII,但下一页是指向第一页的btree节点怎么办...

提示可以是:

  • 扩展名(不太可能是foo.exe可编辑)
  • 流本身的某些内容(如BOM [byte-order-marker])
  • 用户指示(只需编辑文件,goshdarnit)

Windows用于提供API IsTextUnicode,可以进行概率检查,但有一些众所周知的误报。

我的看法是,试图比用户更聪明一些......

答案 1 :(得分:1)

确定文件是否是基于文本的(即二进制文件)是非常昂贵的。无论文件编码如何,您都必须检查文件中的每个字节以确定它是否是有效字符。

答案 2 :(得分:1)

其他人说要查看文件中的所有字节,看看它们是否是字母数字。一些UNIX / Linux工具可以做到这一点,但只需将文件的第一个1K或2K检查为“乐观优化”。

答案 3 :(得分:1)

老实说,鉴于您正在使用的Windows环境,我会考虑使用已知文本格式的白名单。 Windows用户通常经过培训可以坚持使用扩展程序。但是,我个人会放宽它不能在非文本文件上运行的要求,而是在文件与内部白名单不匹配的情况下与用户核对goahead。如果您的搜索字符串很长,则可以减少更改二进制文件的风险 - 假设您没有执行Y2K转换(la sed 's/y/k/g')。

答案 4 :(得分:0)

一个文本文件包含文本,对吗?因此,如果文件只包含文本,那么检查文件的一种非常简单的方法是读取它并检查它是否包含字母数字字符。

所以基本上你要做的第一件事是检查文件编码,如果它的纯ASCII你有一个简单的任务,只需将整个文件读入一个char数组(我假设你是用C / C ++做的)或类似的)并使用函数isalphaisdigit检查该数组中的每个字符...当然,您必须注意特殊例外,例如制表符'\''space''或换行符('在Linux中\ n',在windows中'\ r'\'n'

如果编码不同,过程是相同的,除了你必须使用不同的函数来检查当前字符是否是字母数字字符...还要注意,如果UTF-16或更大的字符是简单的char数组只是小...但如果你在C#中这样做,你不必担心大小:)

答案 5 :(得分:0)

您可以编写一个函数来尝试确定文件是否基于文本。虽然这不是100%准确,但它可能就足够了。这样的功能不需要遍历整个文件,大约一千字节应该足够(甚至更少)。要做的一件事是计算有多少空格和换行符。另一件事是考虑单个字节并检查它们是否是字母数字。通过一些实验,您应该能够提出一个不错的功能。请注意,这只是一种基本方法,文本编码可能会使事情变得复杂。