我已经下载TZipforge,然后再购买。

我对函数ExtractToStream(...)有一些麻烦,因为它给了我
0015错误(找不到文件),尽管我的代码是这样写的:

curdir是当前目录。
存档器是Tzipforge

它基本上是Component Ace的原始源代码,我做了一些小的修改。

procedure TfmMain.Button1Click(Sender: TObject);
VAR
   TStr : String;
   Ts   : TStream;
begin
   Ts := TStream.Create();
   with Archiver do
      begin
         FileName := Curdir + '\Archive\test.zip';
         showmessage(FileName);
         Password := 'testing';
         OpenArchive();           // open an existing archive file

         ExtractToString('forsiden.html',TStr);

         showmessage('filename =  ' + filename);

         if FileExists('C:\test\zipper\archive\test.zip') then
            BEGIN
               ExtractToStream('C:\test\zipper\archive\test.zip',TS);
                         (*     c:\TEST\ZIPPER\Archive\ *)
            END;

        CloseArchive;
        Ts.free;
      end;
    ShowMessage('All files were extracted successfully.');
end;


(出于测试目的)我在原始BASIC示例中包含了ExtracttoStream-function,但仍然收到'0015错误`。

我不知道我在做什么错...文件存在(应存在的位置),程序(例程)仍然显示“找不到文件”。 ”

最佳答案

通常,应该从信任组件开始。它告诉您找不到文件。让我们根据正确的假设进行工作。您的电话是:

ExtractToStream('C:\test\zipper\archive\test.zip',TS);


存档中包含的压缩文件名的第一个参数。但是,您提供了存档文件名。分配给Archiver.FileName时,您已经指定了存档文件名。调用Archiver.OpenArchive时已打开存档文件。因此,没有理由不需要再次提供存档文件名。

归档文件不包含名为'C:\test\zipper\archive\test.zip'的文件。该消息不会通知您存档文件不存在,而是您尝试提取的文件不存在。

看来您实际上是在尝试从档案中提取'forsiden.html'。因此正确的调用将是:

ExtractToStream('forsiden.html',TS);


但是,由于代码中的另一个错误,这也将失败。您绝不能实例化TStream。那是一个抽象的基类。您必须实例化具体的流类,例如TMemoryStreamTFileStream

我还必须敦促您使用try/finally确保不会泄漏要管理其生命周期的对象。

最后,我可以注册对with语句的不信任吗?这已经被讨论了很多次,并且少量的网络搜索将揭示有关该主题的许多文章。也许这一次您摆脱了它,但是它会在某个时候咬住您。

关于delphi - TZipForge + ExtracttoStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45935164/

10-15 06:29