【问题标题】:Delphi - open a zipfile read-onlyDelphi - 以只读方式打开压缩文件
【发布时间】:2016-06-30 06:18:17
【问题描述】:

我使用内部 TZipFile。 当我打开 zip 时,Delphi 似乎只打开它。 只要压缩文件没有被释放,文件访问就会被拒绝

lZipFile := tZipFile.Create;
if lZipFile.IsValid( sPath) then begin
  lZipFile.Open( sPath, zmRead );
...
// access denied to sPath
end;
lZipFile.Free;

我只想读书。为什么delphi会这样? 如果我想多次访问一个 zip 文件,那么我必须制作一个本地副本并使用该副本吗?我真的不喜欢这种解决方法。首先,因为 zip 文件可能很大。

知道我可以做些什么来在只读模式下多次访问同一个 zip 文件吗?

【问题讨论】:

标签: delphi zip


【解决方案1】:

您可以创建以所需共享模式打开的TFileStream 实例。然后使用接受TStreamTZipFile 的重载Open 方法。

请注意TZipFile.IsValid 也会尝试以独占方式打开文件。由于 IsValid 没有像 Open 那样做,我添加了一个 try-except 块来捕获任何无效或不可访问的目标。因此可以省略对IsValid 的调用。

  zip := TZipFile.Create;
  try
    stream := TFileStream.Create(sPath, fmOpenRead + fmShareDenyWrite);
    try
      try
        zip.Open(stream, zmRead);
      except
        on EZipException do begin
          // access denied to sPath
        end;
      end;
    finally
      stream.Free;
    end;
  finally
    zip.Free;
  end;

【讨论】:

  • 你的意思是像system.zip?我尝试了 TFileStream.Create(ZipFileName, LMode, fmShareDenyWrite) - 但文件保持锁定状态(直接在创建 tfilestream 之后。
  • 这样更好:TFileStream.Create(ZipFileName, fmOpenRead + fmShareDenyWrite)。共享模式属于文件模式参数,而不是权限。
  • 使用or 而不是+
  • 谢谢 - 这有帮助。也暗示 TZipFile.IsValid 也正在打开文件排他性。 Delphi开这个独家有什么原因吗?
  • @Jens 因为 RTL 开发人员没有应有的技能和经验
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多