【问题标题】:Why Linux creates temp files without extension when you upload file with PHP, and Windows makes with extension?为什么Linux使用PHP上传文件时创建没有扩展名的临时文件,而Windows使用扩展名?
【发布时间】:2019-05-23 09:47:00
【问题描述】:

我将 PHP 7.0 和 7.2 与 UBUNTU 18.0 TLS 和 Windows 10 一起使用,

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

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

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

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

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

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

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

【问题讨论】:

    标签: php linux windows temp


    【解决方案1】:

    .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 及更高版本的兼容性短名称中。

    【讨论】:

    • 扩展名通常没有注册??它是什么意思,为什么你没有提到任何与 Linux 相关的东西,你是否需要证明这是 Windows 操作系统中的一种自定义方式来标记带有 .temp 扩展名的临时文件以进行安全删除,而 Linux 不能通过这个来工作方式?
    • 未注册表示注册表中没有HKEY_CLASSES_ROOT\.tmp条目。我试图解释这在 Windows 上的历史。在 Linux 上,应用程序总是可以调用 unlink 来确保文件被删除。
    • 我知道Linux可以调用unlink来删除,但是为什么你在这两种情况下都提到删除的想法呢?我仍然不明白您是否需要证明 Windows 使用此扩展程序仅用于安全删除临时文件并且始终可标记或有其他目的兄弟?
    • 我编辑了问题,添加了我所知道的最规范来源的引号。
    • 我试图解释 .TMP 约定的来源,我不明白您还需要什么信息。 Unix/Linux 和 Windows 做的事情不同。归根结底,您为什么要关心 PHP 的功能?只需使用您提供的文件名,不要担心它。
    猜你喜欢
    • 2012-02-16
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多