Почему `FileShare.Read` не работает в сочетании с` FileOptions.DeleteOnClose`? [Дубликат]

Нет, вы не можете использовать оба private a protected вместе. Ваш урок странный. То, что у вас есть, называется так называемым пакетом private или in ot6. Это доступ по умолчанию, который активируется, если не указано явно спецификатор acc6.

13
задан Jon Seigel 11 May 2010 в 17:33
поделиться

4 ответа

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

из MSDN CreateFile docs:

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

17
ответ дан Duncan Smart 20 August 2018 в 22:31
поделиться
  • 1
    Хорошо, я должен прочитать документ MSDN. Спасибо за ответ. Я разрешу проблему, используя приложение-монитор, когда процесс завершается, я удаляю временный файл. – xoreax 13 February 2009 в 18:20

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

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

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

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

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

С уважением, Bodo

-5
ответ дан Bodo Thiesen 20 August 2018 в 22:31
поделиться
  • 1
    Но Unix вообще (не определен Linux, но, возможно, Linux тоже) не имеет опции «удалить, когда файл окончательно закрыт». – Jonathan Leffler 13 February 2009 в 15:35
  • 2
    Это потому, что вы можете удалить его, даже когда он открыт. Пока все, кто в ней нуждается, имеют ручку, все будет работать. – Josh Lee 13 February 2009 в 15:46

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

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

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

0
ответ дан paxdiablo 20 August 2018 в 22:31
поделиться
  • 1
    Тем не менее, создатель мог бы создать файл, затем закрыть его и снова открыть с помощью функции «Только для общего доступа». Наконец, проблема заключается не в том, что файл открыт двумя процессами одновременно, а в вопросе о том, как реализовать этот автоузел. – Bodo Thiesen 13 February 2009 в 16:12
  • 2
    оба, ОС удалит файл сразу же после его закрытия, так что ваш повторный поиск завершится неудачно. – paxdiablo 13 February 2009 в 23:46

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

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

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

-1
ответ дан RvdK 20 August 2018 в 22:31
поделиться
  • 1
    Это вариант в Windows - обсуждался недавно в другом вопросе SO, который я не могу теперь найти. – Jonathan Leffler 13 February 2009 в 15:35
Другие вопросы по тегам:

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