Я использую TFileSteam для открытия файла журнала. Я хотел бы смочь прочитать этот файл журнала от других процессов. Я думал, что fmShareDenyWrite режим позволит это.
Однако, если я пытаюсь открыть файл от других процессов, я получаю ошибку. Например, если я пытаюсь ввести файл из командной строки, я получаю "процесс, не может получить доступ к файлу, потому что это используется другим процессом".
Вот код инициализации файла:
if FileExists(AutoLogFileName) then
_ActivityLogStream := TFileStream.Create(AutoLogFileName,
fmOpenReadWrite or fmShareDenyWrite)
else
_ActivityLogStream := TFileStream.Create(AutoLogFileName,
fmCreate or fmShareDenyWrite);
Примечание: Я использую версию 6 Delphi.
Не знаю, была ли эта ошибка уже в 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.
Режим mfCreate не ведет себя/работает корректно с любым атрибутом share. Для обхода необходимо самому создать хэндл файла и передать его в конструктор
Cheer