我害怕薛定谔的猫.
没有打开它就无法确定文件的内容.文件系统不存储与内容相关的元数据.
如果不打开文件并不是一项艰难的要求,那么您可以使用多种解决方案.
编辑:
在一些评论和答案中已经提出file(1)了确定内容的好方法.的确是.但是,file(1) 打开该问题中禁止的文件.请参阅以下示例中的倒数第二行:
> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
open("file.jpg", O_RDONLY|O_LARGEFILE) = 3
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text
Run Code Online (Sandbox Code Playgroud)
确定文件类型的正确方法是使用file(1)命令.
您还需要注意UTF-8编码的文件是"文本"文件,但可能包含非ASCII数据.其他编码也有这个问题.在具有编码的文本的情况下,代码页,它可能无法明确地判断一个文件是文本还是不行.
file(1)命令将查看文件的结构以尝试确定它包含的内容 - 来自file(1)手册页:
打印的类型通常包含一个单词text(该文件只包含打印字符和一些常用控制字符,并且可以安全地在ASCII终端上读取),可执行文件(该文件包含在表单中编译程序的结果)某些UNIX内核或其他内容可以理解,或者数据意味着其他任何东西(数据通常是'二进制'或不可打印).
关于不同的字符编码,文件(1)手册页有这样的说法:
如果文件与魔术文件中的任何条目都不匹配,则会检查它是否看起来像是文本文件.ASCII,ISO-8859-x,非ISO 8位扩展ASCII字符集(例如Macintosh和IBM PC系统上使用的字符集),UTF-8编码的Unicode,UTF-16编码的Unicode和EBCDIC字符集可以通过在每个集合中构成可打印文本的不同范围和字节序列来区分.如果文件通过任何这些测试,则报告其字符集.ASCII,ISO-8859-x,UTF-8和扩展ASCII文件被标识为"文本",因为它们几乎可以在任何终端上读取; UTF-16和EBCDIC只是'字符数据',因为虽然它们包含文本,但是在可以读取之前需要翻译的文本.
因此,一些文本将被识别为文本,但有些文本可能被识别为字符数据.您需要确定自己是否对您的申请很重要并采取适当的措施.