Как да копирате заключен файл като .pst с помощта на delphi xe3

Мъча се да намеря отговор на следния проблем. Всяка помощ ще бъде оценена.

Използвам следния код, за да опитам да копирам файл outlook.pst, докато Outlook е отворен. И не мога да го накарам да успее. Не дава грешка, просто не копира файла.

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

Ако знаете как ще мога да копирам такъв заключен файл, моля помогнете.

Опитах и ​​открих, че TFilestream също не работи.

И тези 2 са единствените опции, които познавам. всяка помощ ще бъде високо оценена.

Благодаря ти

Опитах и ​​следния код и получавам грешка, че файлът се използва от друг процес (outlook).

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