Почему Linux создает временные файлы без расширения, когда вы загружаете файл с помощью PHP, а Windows создает с расширением? - PullRequest
0 голосов
/ 23 мая 2019

Я использую PHP 7.0 и 7.2 с ULS UBUNTU 18.0 и 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 - да?

1 Ответ

2 голосов
/ 23 мая 2019

.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 и более поздних версий.

...