Delphi: запретить доступ к файлу для других процессов - PullRequest
1 голос
/ 18 июня 2011

Как я могу запретить доступ (только для записи) к файлу для других процессов?Я буду читать \ писать файл все время.

Я использую

FileOpen('c:\1.txt', fmOpenReadWrite or fmShareDenyWrite)

, но после (начиная с загрузки файла в StringList) я получаю ошибку

Не удается открыть файл C: \ 1.txt.Процесс не может получить доступ к файлу, потому что он используется другим процессом. "

Только я открываю файл.

1 Ответ

8 голосов
/ 18 июня 2011

Здесь сообщение об ошибке на самом деле немного вводит в заблуждение.Причина, по которой вы не можете загрузить в список строк, заключается в том, что вы уже открыли файл для чтения / записи.

, если вы проверяете реализацию TStrings.LoadfromFile:

procedure TStrings.LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

Вы видите, чтоон пытается открыть файл с условием «DenyWrite», но вы уже открыли файл в режиме записи.По этой причине происходит сбой.

Вы можете обойти это, используя вместо этого LoadFromStream.

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    Stringlist.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

Обратите внимание, что вам потребуется использовать fmShareDenyNone, чтобы это работало в такой ситуации.С другой стороны, вы могли бы, вероятно, повторно использовать дескриптор чтения / записи, полученный из вашего OpenFile, возможно, сделать что-то вроде этого:

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStream;
  iPosition : Int64;
begin
  Stream := THandleStream.Create(FHandle); //FHandle is the read/write handle returned by OpenFile
  try
    iPosition := Stream.Position;
    Stream.Seek(0, soFromBeginning);
    Stringlist.LoadFromStream(Stream);
    Stream.Position := iPosition;
    //Restore stream position.
  finally
    Stream.Free;
  end;
end;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...