gpt4 book ai didi

delphi - 检查 Zip 文件的有效性

转载 作者:行者123 更新时间:2023-12-03 18:27:15 29 4
gpt4 key购买 nike

当我尝试检查 zip 文件的有效性时,会引发一个异常,即该进程无法访问该文件,因为它正在被另一个进程使用,但 Open1.Click 中的代码可以毫无问题地打开该 zip 文件。 Valid1Click 有什么问题吗?

procedure TForm1.Valid1Click(Sender: TObject);
{ Is the zip file valid. }
var
iZipFile: TZipFile;
iZipFilename: string;
iValid: Boolean;
begin
Screen.Cursor := crHourGlass;
try
{ Create the TZipFile Class }
iZipFile := TZipFile.Create;
try
if FileExists(ZipFilename1.Text) then
begin
iZipFilename := ZipFilename1.Text;
{ Open zip file for reading }
iZipFile.Open(iZipFilename, zmRead);
iValid := iZipFile.IsValid(iZipFilename);
if iValid then
MessageBox(0, 'The zip file is valid.', 'Check Zip File',
MB_ICONINFORMATION or MB_OK)
else
MessageBox(0, 'The zip file is NOT valid.', 'Check Zip File',
MB_ICONWARNING or MB_OK);
end
else
begin
MessageBox(0, 'The zip file does not exist.', 'Warning',
MB_ICONWARNING or MB_OK);
end;
{ Close the zip file }
iZipFile.Close;
finally
iZipFile.Free;
end;
finally
Screen.Cursor := crDefault;
end;
end;

procedure TForm1.Open1Click(Sender: TObject);
{ Open zip file. }
var
i: integer;
iZipFile: TZipFile;
iFilename: string;
iDateTime: TDateTime;
iCompressedSize: cardinal;
iUnCompressedSize: cardinal;
iCRC32: cardinal;
iCompressionMethod: word;
iFileComment: string;
iListItem: TlistItem;
begin
if OpenDialog1.Execute then
begin
if FileExists(OpenDialog1.FileName) then
begin
iZipFile := TZipFile.Create;
try
ListView1.Items.Clear;
ZipFilename1.Text := OpenDialog1.FileName;
try
iZipFile.Open(ZipFilename1.Text, zmReadWrite);
for i := 0 to iZipFile.FileCount - 1 do
begin
iFilename := iZipFile.FileNames[i];
iListItem := ListView1.Items.Add;
iListItem.Caption := iFilename;
iDateTime := FileDateToDateTime
(iZipFile.FileInfo[i].ModifiedDateTime);
iListItem.SubItems.Add(DateTimeToStr(iDateTime)); { 0 }
iCompressedSize := iZipFile.FileInfo[i].CompressedSize;
iListItem.SubItems.Add(FormatByteSize(iCompressedSize)); { 1 }
iUnCompressedSize := iZipFile.FileInfo[i].UncompressedSize;
iListItem.SubItems.Add(FormatByteSize(iUnCompressedSize)); { 2 }
iCRC32 := iZipFile.FileInfo[i].CRC32;
iListItem.SubItems.Add(IntToStr(iCRC32)); { 3 }
iCompressionMethod := iZipFile.FileInfo[i].CompressionMethod;
iListItem.SubItems.Add
(ZipCompressionToStr(iCompressionMethod)); { 4 }
iFileComment := iZipFile.Comment;
iListItem.SubItems.Add(iFileComment); { 5 }
end;
iZipFile.Close;
except
on E: Exception do
begin
ShowMessage(E.ClassName + #10#13 + E.Message);
end;
end;
finally
iZipFile.Free;
end;
end;
end;

最佳答案

你有这些行错误的方式:

iZipFile.Open(iZipFilename, zmRead);
iValid := iZipFile.IsValid(iZipFilename);

第一行锁定文件,因此第二行失败。您必须调用 IsValid在调用 Open 之前.

话虽如此,既然您使用 zmRead ,应该可以调用 IsValid再次打开文件,因为调用 Open使用 fmOpenRead .所以我怀疑您使用的Delphi版本中的ZIP文件代码或文件流代码可能存在错误。都一样,调用 IsValid之前 Open肯定会工作。

事实上, IsValid是一个类方法。你应该这样称呼它:
iValid := TZipFile.IsValid(iZipFilename);

归根结底还是一样,但它让代码的读者清楚地知道,方法调用不依赖于实例的状态。

事实上,我个人会简单地取消对 IsValid 的调用。直接调用 Open .如果失败,我相信会引发有意义的错误消息。

更新

看起来您根本不想打开文件,只想检查其有效性。在这种情况下,您不需要实例,也不需要调用构造函数,只需对 TZipFile.IsValid 进行一次调用即可。 .
procedure TForm1.Valid1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
try
if FileExists(ZipFilename1.Text) then
begin
if TZipFile.IsValid(ZipFilename1.Text) then
...
finally
Screen.Cursor := crDefault;
end;
end;

关于delphi - 检查 Zip 文件的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21337407/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com