非正式地,我们大多数人都知道存在"二进制"文件(目标文件,图像,电影,可执行文件,专有文档格式等)和"文本"文件(源代码,XML文件,HTML文件,电子邮件等).
通常,您需要知道文件的内容才能对其执行任何有用的操作,并且如果编码是"二进制"或"文本",则形成该视点,这并不重要.当然,文件只存储数据字节,因此它们都是"二进制",而"文本"并不意味着什么,而不知道编码.然而,谈论'二进制'和'文本'文件仍然很有用,但为了避免冒犯任何具有这种不精确定义的人,我将继续使用'恐慌'报价.
但是,有各种工具可以处理各种文件,实际上,您希望根据文件是"文本"还是"二进制"来执行不同的操作.这方面的一个例子是在控制台上输出数据的任何工具.简单的"文本"看起来很好,很有用.'二进制'数据会扰乱您的终端,并且通常无法查看.GNU grep在确定是否应该输出匹配到控制台时至少使用这种区别.
那么,问题是,如何判断文件是"文本"还是"二进制"?而且要进一步限制,你如何在类似Linux的文件系统上讲述?我不知道任何文件系统元数据指示文件的"类型",所以通过检查文件的内容,我如何判断它是"文本"还是"二进制"?为简单起见,我们将"text"限制为可在用户控制台上打印的字符.特别是你会如何实现这个?(我认为这是暗示在这个网站上,但我想一般来说,指向现有的代码,这应该是有用的,我应该指定),我不是真的在我可以使用的现有程序之后做什么这个.
我真的习惯grep -iIr在Unix shell 上做,但我还没有能够获得PowerShell等价物.
基本上,上面的命令递归搜索目标文件夹并忽略二进制文件,因为"-I"选项.此选项也等同于--binary-files=without-match选项,其中显示"将二进制文件视为与搜索字符串不匹配"
到目前为止,我一直在使用Get-ChildItems -r | Select-String我的PowerShell grep替换偶尔Where-Object添加.但我还没有找到一种方法来忽略grep -I命令所做的所有二进制文件.
如何使用Powershell过滤或忽略二进制文件?
所以对于给定的路径,我只想Select-String搜索文本文件.
编辑: 在Google上再制作几个小时这个问题如何识别文件的内容是ASCII还是二进制.问题是"ASCII",但我相信作者的意思是"文本编码",就像我自己一样.
编辑:似乎isBinary()需要编写一个来解决这个问题.可能是一个C#命令行实用程序,使其更有用.
编辑:似乎grep正在做的是检查ASCII NUL字节或UTF-8 Overlong.如果存在,则认为文件是二进制文件.这是一个memchr()调用.
我想知道用Node.js检查文件是二进制还是ASCII的最佳方法是什么?
似乎有两种不特定于node.js的方法:
检查MIME类型:如何在PHP中检查文件是ASCII还是二进制 - 但是这有问题,例如前驱动器通常没有识别的mime类型,并application/octet-stream在使用mime检查时恢复
通过使用流缓冲区检查字节大小,如何将文件内容标识为ASCII或二进制 - 这似乎非常密集,并且还提供了node.js示例.
那么还有另一种方式吗?也许是一个我不知道的秘密node.js呼叫或模块?或者如果我必须自己这样做,会建议采用什么方式?
谢谢
目前我得到文件的文件扩展名,如:
string fileExt = System.IO.Path.GetExtension(filUpload.FileName);
Run Code Online (Sandbox Code Playgroud)
但是如果用户更改了文件的文件扩展名(例如用户可以将"test.txt"重命名为"test.jpg"),我就无法获得真正的扩展名.解决方案是什么?
如何检测文件是二进制还是纯文本?
基本上我的.NET应用程序正在处理批处理文件和提取数据但是我不想处理二进制文件.
作为一种解决方案,我正在考虑分析文件的前X个字节,如果有比可打印字符更多的不可打印字符,那么它应该是二进制的.
这是正确的方法吗?这项任务有更好的实施吗?
ascii ×2
binary ×2
.net ×1
asp.net ×1
binaryfiles ×1
file ×1
file-format ×1
file-upload ×1
format ×1
grep ×1
node.js ×1
powershell ×1
unix ×1