我使用内部 TZipFile。 当我打开 zip 时,Delphi 似乎只打开它。 只要 zip 文件没有被释放,文件访问就会被拒绝
lZipFile := tZipFile.Create;
if lZipFile.IsValid( sPath) then begin
lZipFile.Open( sPath, zmRead );
...
// access denied to sPath
end;
lZipFile.Free;
我只想读书。为什么delphi会这样? 如果我想多次访问一个 zip 文件,那么我必须制作一个本地副本并使用该副本吗?我真的不喜欢这个解决方法。首先,因为 zip 文件可能很大。
知道如何才能以只读模式同时多次访问同一个 zip 吗?
最佳答案
您可以创建一个以所需共享模式打开的TFileStream
实例。然后使用 TZipFile
的重载 Open
方法来接受 TStream
。
请注意,TZipFile.IsValid
也会尝试以独占方式打开文件。由于 IsValid
不做 Open
所做的事情,因此我添加了一个 try- except block 来捕获任何无效或无法访问的目标。因此可以省略对 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;
关于Delphi - 以只读方式打开 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38115296/