Удалить в закрытых файлах

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

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

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

Какие-либо предложения?

Ответы

Ответ 1

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

Из MSDN CreateFile docs:

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

Ответ 2

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

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

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

Ответ 3

Я хочу создать файл с флагом FileOptions.DeleteOnClose в временная папка.

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

Просьба уточнить. Как этот файл удаляется ОС. Если вы хотите удалить его по коду. Почему бы не сохранить поток. Затем вы можете открыть его с помощью Process.Start

Ответ 4

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

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

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

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

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

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