Как скопировать заблокированный файл, например .pst, с помощью delphi xe3

Я изо всех сил пытаюсь найти ответ на следующую проблему. Любая помощь будет оценена по достоинству.

Я использую следующий код, чтобы попытаться скопировать файл outlook.pst, пока Outlook открыт. И я не могу добиться успеха. Ошибки не выдает, просто не копирует файл.

copyfile('C:\Users\Administrator\Documents\Outlook Files\Outlook.pst','F:\Outlook.pst');

Если вы, ребята, знаете, как я смогу скопировать такой заблокированный файл, пожалуйста, помогите.

Я попробовал и обнаружил, что TFilestream также не работает.

И эти 2 - единственные варианты, которые я знаю. любая помощь будет принята с благодарностью.

Спасибо

Я также пробовал следующий код и получаю сообщение об ошибке, говорящее о том, что файл используется другим процессом (внешний вид).

procedure TForm1.Button2Click(Sender: TObject);
var
   NewFileName: string;
   NewFile: TFileStream;
   OldFile: TFileStream;
Begin
           NewFileName:='F:\outlook.pst';
           OldFile := TFileStream.Create('C:\Users\Administrator\Documents\Outlook Files\outlook.pst', fmOpenRead or fmShareDenyWrite);
            try
              NewFile := TFileStream.Create(NewFileName, fmCreate or fmShareDenyNone);
              try
                NewFile.CopyFrom(OldFile, OldFile.Size);
              finally
                FreeAndNil(NewFile);
              end;
            finally
              FreeAndNil(OldFile);
            end;
end;

См. следующую ссылку. Если кто-то может преобразовать код. проблема должна быть решена. Как скопировать файл pst пока он открыт с помощью c#


person user3271392    schedule 04.02.2014    source источник


Ответы (2)


Поставщик PST блокирует файлы PST до завершения родительского процесса. Даже если вы закроете файл PST из Outlook, он будет оставаться открытым в течение 30 минут из соображений производительности.

Вы программно открываете файл PST в Outlook?

person Dmitry Streblechenko    schedule 04.02.2014
comment
Нет, я просто хочу иметь возможность копировать его из одного места в другое во время работы Outlook... Любые идеи? - person user3271392; 04.02.2014

Попробуйте флаг fmShareDenyNone при создании объекта TFileStream:

stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
try 
   slFile.LoadFromStream(stream);
finally
   stream.Free;
end;

Функция чтения даты из файла:

function GetFileDate(TheFileName: string): string;
var
  FHandle: integer;
begin
  FHandle := FileOpen(TheFileName, fmShareDenyNone);
  try
    Result := DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));
  finally
    FileClose(FHandle);
  end;
end;
person Juliano    schedule 04.02.2014
comment
Спасибо, я попробую и дам вам знать. - person user3271392; 04.02.2014
comment
Пожалуйста, проверьте изменения выше. я включил твой код - person user3271392; 04.02.2014
comment
Я думаю, вам нужно использовать fmShareDenyNone в OldFile вместо NewFile. - person Juliano; 04.02.2014
comment
простите за ошибку, я адаптировал. Но я все равно получаю ошибку Ошибка чтения потока. когда я выполняю команду - person user3271392; 04.02.2014
comment
Вы пробовали использовать FileOpen и fmShareDenyNone? В этом случае вам придется обрабатывать копию вручную, то есть вы должны открывать исходный и конечный файлы, читать байты из источника и записывать их в место назначения, используя чтение/запись. - person Juliano; 04.02.2014
comment
Я, наверное, глупый, но я потерял тебя полностью. Можете ли вы опубликовать пример того, что вы имеете в виду? - person user3271392; 04.02.2014
comment
Я отредактировал код, чтобы привести пример того, как получить дату из файла, который можно открыть в данный момент. - person Juliano; 04.02.2014