file - 文件类型依赖于文件扩展名吗?

标签 file operating-system file-type

作为一个一般性问题:在确定文件类型时文件扩展名的作用是什么?

例如,我可以将 .jpeg 文件更改为 .png 扩展名,甚至 .txt。当然,如果改成.txt,就无法以图片形式打开,无法读取。

要确定文件类型,似乎安全的方法是解析文件的前几个字节。如果扩展名不可信,则扩展名只不过是文件名。

最佳答案

作为一般规则,您应该始终解析完整的文件,以确保该文件与扩展名相同。正如您可以轻松想象的那样,创建类似于例如的二进制文件非常简单。 BMP(具有正确的 header ),但包含不同的内容。

您永远不应该信任扩展名或 header ,否则恶意用户可能会利用您的某些代码来生成例如缓冲区溢出,如果您正在编写必须以 root/admin 权限运行的程序,这绝对是最重要的。

话虽如此,现在的文件扩展名主要用于使操作系统可以将程序与该特定文件关联起来(通常调用该程序并将所选文件作为第一个参数传递),然后由程序来执行确定文件内容。

谈论可执行文件时有点不同。在 Unix 下,为了可执行,文件必须设置“x”标志,否则无论扩展名如何,文件都不会运行。在 Windows 下,没有这样的东西,操作系统仅依靠少数扩展名(EXE、COM、BAT 等)来确定可以执行哪些文件。

例如,EXE 文件必须以“MZ”开头,后跟有关其分配和大小的一些信息( http://www.delorie.com/djgpp/doc/exe/ ),并且操作系统肯定会检查其内部 header 。其他格式(例如MS-DOS时代的COM可执行格式)只是“纯”汇编代码,因此操作系统不进行检查。它只是解释这些操作码,希望一切都会好起来。

所以,总结一下:

  • 文件扩展名主要是为了让操作系统调用相应的程序来打开它(将文件名作为第一个参数传递,例如C语言中的argc/argv)

  • Windows 依靠某些文件扩展名来确定文件是否可执行,而 Unix/Mac 则依靠与文件关联的特定标志 (x)

有关文件扩展名的两件事不太为人所知:目录名也可以有扩展名,并且扩展名可以比通常的 3 个字符长得多。

关于file - 文件类型依赖于文件扩展名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35809458/

相关文章:

java - 如何编写Java文件路径

c中的子进程信号处理

windows - 什么是工作集?

objective-c - Cocoa:拖放任何文件类型

ios - 在 ios 上新注册的文件类型的 "Open in"菜单中没有显示我的应用程序名称

file - 在 SQL Server Management Studio 中导入数据库(SQL 文件)

C:将另一个文本文件中的 URL 保存在 txt 文件中

java - 返回 ArrayList<file> 方法 java

python - strace:没有 <resumed> 的连续 <unfinished...> 系统调用是什么意思?

sublimetext - Sublime无法识别扩展