Удалите на близких файлах

Язык использовал: C#

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

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

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

13
задан stop-cran 24 July 2019 в 06:17
поделиться

3 ответа

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

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

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

18
ответ дан 2 December 2019 в 00:59
поделиться

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

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

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

0
ответ дан 2 December 2019 в 00:59
поделиться

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

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

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

Назад к Вашей проблеме: Поскольку весь этот doen't работает над Windows, Вы могли сделать два других подхода:

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

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

-6
ответ дан 2 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: