Режим fmShareDenyWrite не работает - PullRequest
5 голосов
/ 28 июня 2010

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 28 июня 2010

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

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

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

  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 - локальная переменная типа Word.

2 голосов
/ 28 июня 2010

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

Cheer

...