Удаление заблокированного файла, созданного с помощью TempFile - PullRequest
0 голосов
/ 30 марта 2019

У меня есть патчер для приложения с графическим интерфейсом (lxn / walk), который загружает файл через ftp, передает его во временный файл и извлекает содержимое для обновления локальных файлов. Команда удаления файла откладывается.

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

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

Теперь я застрял и не знаю, что делать, чтобы убедиться, что временный файл автоматически исчезает, когда патчер не работает. Как мне сделать это правильно?

Файл также может быть создан как обычный файл, а не как временный файл. Я просто хотел бы также спросить, где в Windows лучше всего написать временный файл?

1 Ответ

2 голосов
/ 30 марта 2019

Теперь я застрял и не знаю, что делать, чтобы убедиться, что временный файл автоматически исчезает, когда патчер не работает.Как мне сделать это правильно?

Не существует гарантированных способов сделать это, поскольку многие вещи, не зависящие от приложения, могут привести к его выходу.Сбой питания или паника ядра из-за какой-либо аппаратной проблемы могут привести к сбою компьютера или его перезапуску.

Общепринятая стратегия заключается в реализации проверки запуска программы на наличие статуса предыдущего запуска.,Некоторые приложения создают файл блокировки при запуске и удаляют его при корректном выходе.Если этот файл блокировки существует при перезапуске программы, это означает, что предыдущий запуск не привел к чистому завершению, и приложение может предпринять любые корректирующие действия.Точное действие зависит от характера приложения, некоторые отказываются запускаться, другие предупреждают пользователей.

Я бы тоже хотел спросить, где в Windows лучше всего написатьвременный файл?

Каждая ОС имеет свое собственное расположение для временных файлов.Если вы исключите аргумент dir для TempFile, он будет создан в соответствующем месте, как указано в документации 1016 *:

TempFile создает новый временныйфайл в каталоге dir, открывает файл для чтения и записи и возвращает полученный *os.File.Имя файла генерируется путем взятия шаблона и добавления случайной строки в конец.Если шаблон включает "*", случайная строка заменяет последнюю "*". Если dir - пустая строка, TempFile использует каталог для временных файлов по умолчанию (см. os.TempDir). Несколько программ, вызывающих TempFile одновременно, не будут выбирать один и тот же файл.Вызывающий может использовать f.Name(), чтобы найти путь к файлу.Вызывающий абонент должен удалить файл, когда он больше не нужен.

С os.TempDir мы видим следующее:

В системах Unix, он возвращает $TMPDIR, если не пуст, иначе /tmp.В Windows он использует GetTempPath, возвращая первое непустое значение из %TMP%, %TEMP%, %USERPROFILE% или каталога Windows.В плане 9 он возвращает /tmp.

Каталог не гарантированно не существует и не имеет доступных разрешений.

...