Удалить файл при выходе - PullRequest
2 голосов
/ 12 июня 2011

Возможно, я ошибаюсь, но я убежден, что UNIX и стандартная библиотека C предоставляют некоторую возможность заставить ОС удалить файл после завершения процесса.Но я не могу вспомнить, как это называется (или, может быть, я себе это представлял).В моем конкретном случае я хотел бы получить доступ к этой функциональности из perl.

Java имеет функцию deleteOnExit, но я понимаю, что удаление выполняется JVM в отличие от ОС, что означает, что если JVM выходит нечисто(например, сбой питания), тогда файл никогда не будет удален.

Но я понимаю средство, которое я ищу (если оно существует), так как оно предоставляется ОС, ОС следит за удалением файла,по-видимому, выполнение некоторой работы по очистке при запуске ОС в случае сбоя питания и т. д., и, конечно, выполнение очистки в случае нечистого завершения процесса.

Ответы [ 5 ]

10 голосов
/ 12 июня 2011

Очень очень простое решение (которое работает только на * nix системах):

  1. Создайте и откройте файл (держите его под рукой)
  2. Немедленно позвоните unlink по файлу
  3. Действуйте как обычно, используя дескриптор файла, и выходите, когда захотите

Затем, когда ваша программа завершена, дескриптор файла закрывается, и файл действительно удаляется. Это будет работать даже в случае сбоя программы.

Конечно, это работает только в контексте одного скрипта (то есть другие скрипты не смогут напрямую управлять файлом, хотя вы МОЖЕТЕ передать им дескриптор файла).

4 голосов
/ 12 июня 2011

Если вы ищете что-то, о чем ОС может автоматически позаботиться при перезапуске после сбоя питания, блока END недостаточно, вам нужно создать файл, в котором ОС ожидает временный файл.И как только вы это сделаете, вы должны просто использовать одну из подпрограмм File :: Temp (которые даже предлагают опцию открытия и немедленной отмены связи файла, если хотите).

2 голосов
/ 12 июня 2011

Я думаю, что вы ищете функцию с именем tmpfile(), которая создает файл при вызове и удаляет его при закрытии.чек артикул

2 голосов
/ 12 июня 2011

Вы ищете atexit().В Perl это обычно делается с END блоками.Java и Perl предоставляют свои собственные, потому что они хотят быть переносимыми на системы, которые не соответствуют соответствующим стандартам (в данном случае C90).

Тем не менее, в Unix общим соглашением является open файла затем unlink это;ядро удалит его, когда будет закрыта последняя ссылка (то есть дескриптор вашего файла).Вы почти всегда хотите открыть для чтения + записи.

0 голосов
/ 12 июня 2011

Вы можете выполнять свою работу в END блоке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...