Удалить при закрытии файлов - PullRequest
13 голосов
/ 13 февраля 2009

Используемый язык: C #

Теория: Я хочу создать файл с флагом FileOptions.DeleteOnClose во временной папке. Файл успешно создан, и я записываю на него данные, следующий шаг - запустить приложение, связанное с файлом Process.Start (...), и позволить пользователю проверить документ, наконец, я закрываю свой дескриптор и, как только другой процесс закрывает дескриптор временного файла, файл удаляется операционной системой.

Моя проблема в том, что другие процессы не могут открыть файл, даже для чтения, несмотря на то, что я добавлю FileShare.ReadWrite | FileShare.Delete к режиму обмена.

Есть предложения?

Ответы [ 3 ]

18 голосов
/ 13 февраля 2009

Другие процессы должны указывать FileShare.Delete при открытии файла DeleteOnClose

Из MSDN CreateFile документы:

"FILE_FLAG_DELETE_ON_CLOSE ... Последующие запросы открытия файла не будут выполнены, если не указан режим общего доступа FILE_SHARE_DELETE."

0 голосов
/ 13 февраля 2009

Проверьте это:

Необходимо убедиться, что все процессы открывают файл с помощью FileShare.ReadWrite и FileShare.Delete.

Даже если создатель открывает с помощью share-readwrite, если вторая программа пытается открыть с помощью share-read, вторая программа в основном говорит, что никто другой не может писать. Но первая программа уже обладает такой мощностью, поэтому второе открытие завершается неудачно.

0 голосов
/ 13 февраля 2009

Переключиться на Linux scnr

Хорошо, теперь серьезно: это недостаток операционной системы Windows, который не может быть обойден. Каждая программа, открывающая файл, должна согласовывать другие программы, имеющие файл, открытый одновременно. Это была проблема, с которой я столкнулся много лет назад, когда все еще использовал Windows. Недостаточно открыть файл и сказать: пусть кто-нибудь еще тоже откроет это. Другие также должны сказать, что откройте этот файл, даже если он уже открыт.

В Linux, напротив, операционная система не допускает блокировку файлов, как это делает Windows. Здесь, если какой-либо файл используется более чем одной программой одновременно, сами программы должны убедиться, что одновременный доступ заблокирован. Кроме того, в Linux мы можем просто создать файл, убедиться, что другой процесс был запущен и открыть файл, а затем просто удалить файл (пока он открыт). Затем имя файла немедленно удаляется из файловой системы, но файл все еще поддерживается драйвером файловой системы до тех пор, пока не будет удалена последняя ссылка (включая дескрипторы открытого файла).

Возвращаясь к вашей проблеме: поскольку все это не работает в Windows, вы можете использовать два других подхода:

  1. Зарегистрируйте файл, который будет удален при следующей загрузке (в дни Win3x в win.ini был раздел для этого. Более новая версия Windows все еще поддерживает это, я просто больше не могу вспомнить, как это делается сейчас ).
  2. Запустите другой процесс, подождите, пока он откроет файл, закройте файл и затем пытайтесь каждую минуту удалять файл, пока удаление не будет успешным ...

С уважением, Бодо

...