1

Abbrevia を使用して ZIP アーカイブを作成しようとしています。コードは次のようになります。

procedure TMyClass.AddToArchive(archive: TAbZipArchive; const filename: string);
var
   fullname: string;
begin
   FReport.newStep(format('Preparing %s...', [filename]));
   if trim(filename) = '' then
      Exit;
   fullname := TPath.Combine(GetRootPath(), filename);
   if fileExists(fullname) then
      archive.AddFiles(filename, faAnyFile)
   else FMissingValues.add(ExtractFileName(fullname));
end;

procedure TMyClass.ZipProc(Sender : TObject; Item : TAbArchiveItem;
  OutStream : TStream);
begin
  AbZip(TAbZipArchive(Sender), TAbZipItem(Item), OutStream);
end;

procedure TMyClass.BuildArchive(const files, zipname: string);
var
   list: TStringList;
   archive: TAbZipArchive;
   filename, root: string;
begin
   archive := TAbZipArchive.Create(zipname, fmCreate);
   list := TStringList.Create;
   try
      archive.InsertHelper := ZipProc;
      root := GetRootPath();
      archive.BaseDirectory := root;
      list.Text := files;
      for filename in list do
         AddToArchive(archive, TPath.Combine(root, filename));
      archive.Save;
   finally
      archive.Free;
      list.free;
   end;
end;

1 つの問題を除いて、有効な zip ファイルが返されます。結果の zipfile では、フォルダ構造は、C: ドライブのルートに対して相対的に作成されますarchive.BaseDirectory。(すべてが \Users\Mason\Documents\etc の下に保存されます...) どうやらBaseDirectoryプロパティの目的を誤解しているようです。挿入したファイルを特定のルート フォルダーに相対的に保存するにはどうすればよいですか?

4

1 に答える 1

3

AddFiles では絶対パスを使用しないでください。BaseDirectory への相対パスのみを使用してください。

于 2014-02-06T16:26:35.537 に答える