режим fmShareDenyWrite, кажется, не работает

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

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

Вот код инициализации файла:

if FileExists(AutoLogFileName) then
   _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
          fmOpenReadWrite or fmShareDenyWrite)
else
   _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
          fmCreate or fmShareDenyWrite);

Примечание: Я использую версию 6 Delphi.

5
задан mjn 19 October 2010 в 13:46
поделиться

2 ответа

Не знаю, была ли эта ошибка уже в D6, но это вполне возможно. Существует отчет QC об этом, составленный в отношении D2007: QC 65767: http://qc.embarcadero.com/wc/qcmain.aspx?d=65767. Этот отчет теперь закрыт, так как проблема была решена в D2010 (14.0.3467.22472, если быть точным).

Обновление (вызванное комментарием Gabr):

Вы можете создать свой собственный потомок TFileStream, который будет соблюдать режим. Просто переопределите конструктор Create(const AFileName: string; Mode: Word; Rights: Cardinal) (есть два перегруженных конструктора) и обработайте параметр режима самостоятельно. Скопируйте код из исходного конструктора и измените

  if Mode = fmCreate then
  begin
    inherited Create(FileCreate(AFileName, Rights));

на

  if (Mode and fmCreate = fmCreate) then
  begin
    myMode := Mode and $FF;
    if myMode = $FF then
      myMode := fmShareExclusive;
    inherited Create(FileCreate(AFileName, myMode, Rights));

где myMode - локальный var типа Word.

8
ответ дан 13 December 2019 в 22:01
поделиться

Режим mfCreate не ведет себя/работает корректно с любым атрибутом share. Для обхода необходимо самому создать хэндл файла и передать его в конструктор

Cheer

2
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

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