为什么用PHP上传文件时Linux会创建不带扩展名的临时文件,而Windows用扩展名来制作临时文件?

时间:2019-05-23 09:47:01

标签: php linux windows temp

我正在同时使用UBUNTU 18.0 TLS和Windows 10的PHP 7.0和7.2,

我有一个脚本,通常可以上传文件并处理其内容,

我要问的问题是,在Ubuntu上,为上载文件创建的临时文件是在没有如下扩展名的情况下创建的:

path: "/tmp"
filename: "phpdvdVPB"
basename: "phpdvdVPB"
pathname: "/tmp/phpdvdVPB"
extension: ""

但是在Windows上,创建的临时文件的扩展名为:

"dirname" => "C:\xampp\tmp"
"basename" => "php34E6.tmp"
"extension" => "tmp"
"filename" => "php34E6"

当您使用tempnam()PHP方法创建临时文件时,也会发生相同的结果,它将在Linux上创建没有扩展名的文件,但Windows将具有扩展名。

所以我的问题是,为什么Linux创建不带扩展名的临时文件,而Windows是?

1 个答案:

答案 0 :(得分:2)

.TMP在Windows上没有程序含义,该扩展名通常未注册。但是,临时文件具有此扩展名是一个常见约定,以便用户知道可以安全删除这些文件。

DOS和旧版Windows不支持在关闭最后一个句柄时自动删除文件,因此,如果应用程序崩溃,则可能无法删除其临时文件。

PHP可能正在使用GetTempFileName函数,该函数会自动为您添加此扩展名。此功能将为您创建一个唯一的文件名。

实际上,有一种方法可以在Windows上标记临时文件,但最终用户并没有真正了解此功能。可以使用FILE_ATTRIBUTE_TEMPORARY属性标记文件。这告诉Windows不要将内容写入磁盘,除非内存管理器在分页过程中要求。

我没有规范的文档参考说明所有.TMP文件都是临时文件,这是古老的历史,并且按照惯例完成。

除了GetTempFileName函数使用此扩展名之外,KB 92635还说:

  

许多不同的目录中的文件可能会出现在硬盘驱动器上,并以波浪号(〜)开头并以.TMP扩展名结尾。这些可能是Windows创建的临时文件,由于Windows会话不定期退出而保留在硬盘驱动器上。

     

在正常情况下,当您退出Windows会话时,Windows将关闭并删除这些文件。但是,如果您以不定期的方式退出Windows(例如,在活动的Windows会话中重新启动计算机或将其关闭),则文件不会关闭或删除。

     

...

     

要删除临时文件,请执行以下步骤:

     

...

     

删除任何现有的.TMP文件。确保在删除这些文件时Windows没有运行。这些.TMP文件中的某些文件可能是Windows正在使用的文件。

该文档针对Windows 2和3。〜前缀是可选的,并且〜用于Windows 95及更高版本上的兼容性短名称。