📄 unzip4.pas
字号:
pfile_in_zip_read_info^.pos_in_zipfile :=
s^.cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + uLong(iSizeVar);
//changed by 謒黵, original:s^.cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;
pfile_in_zip_read_info^.stream.avail_in := uInt(0);
s^.pfile_in_zip_read := pfile_in_zip_read_info;
unzOpenCurrentFile := UNZ_OK;
end;
{$HINTS ON}
{ Read bytes from the current file (opened by unzOpenCurrentFile)
buf contain buffer where data must be copied
len the size of buf.
return the number of byte copied if somes bytes are copied
return 0 if the end of file was reached
return <0 with error code if there is an error
(UNZ_ERRNO for IO error, or zLib error for uncompress error) }
function unzReadCurrentFile(afile : unzFile;
buf : voidp;
len : unsigned) : int; { ZEXPORT }
var
err : int;
iRead: uInt;
s : unz_s_ptr;
pfile_in_zip_read_info : file_in_zip_read_info_s_ptr;
var
uReadThis : uInt;
var
uDoCopy,i : uInt;
var
uTotalOutBefore,uTotalOutAfter : uLong;
bufBefore : pBytef;
uOutThis : uLong;
flush : int;
begin
{$WARNINGS OFF}
err := UNZ_OK;
iRead := 0;
if (afile=NIL) then
begin
unzReadCurrentFile := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
pfile_in_zip_read_info := s^.pfile_in_zip_read;
if (pfile_in_zip_read_info=NIL) then
begin
unzReadCurrentFile := UNZ_PARAMERROR;
exit;
end;
if ((pfile_in_zip_read_info^.read_buffer = NIL)) then
begin
unzReadCurrentFile := UNZ_END_OF_LIST_OF_FILE;
exit;
end;
if (len=0) then
begin
unzReadCurrentFile := 0;
exit;
end;
pfile_in_zip_read_info^.stream.next_out := pBytef(buf);
pfile_in_zip_read_info^.stream.avail_out := uInt(len);
if (uLong(len)>pfile_in_zip_read_info^.rest_read_uncompressed) then
//changed by 謒黵, org:if (len)pfile_in_zip_read_info^.rest_read_uncompressed) then
pfile_in_zip_read_info^.stream.avail_out :=
uInt(pfile_in_zip_read_info^.rest_read_uncompressed);
while (pfile_in_zip_read_info^.stream.avail_out>0) do
begin
if ((pfile_in_zip_read_info^.stream.avail_in = 0) and
(pfile_in_zip_read_info^.rest_read_compressed>0) ) then
begin
uReadThis := UNZ_BUFSIZE;
if (pfile_in_zip_read_info^.rest_read_compressed<uReadThis) then
uReadThis := uInt(pfile_in_zip_read_info^.rest_read_compressed);
if (uReadThis = 0) then
begin
unzReadCurrentFile := UNZ_EOF;
exit;
end;
if (fseek(pfile_in_zip_read_info^.afile,
pfile_in_zip_read_info^.pos_in_zipfile +
pfile_in_zip_read_info^.byte_before_the_zipfile,SEEK_SET)<>0) then
begin
unzReadCurrentFile := UNZ_ERRNO;
exit;
end;
if fread(pfile_in_zip_read_info^.read_buffer, uReadThis, 1,
pfile_in_zip_read_info^.afile)<>1 then
begin
unzReadCurrentFile := UNZ_ERRNO;
exit;
end;
Inc(pfile_in_zip_read_info^.pos_in_zipfile, uReadThis);
Dec(pfile_in_zip_read_info^.rest_read_compressed, uReadThis);
pfile_in_zip_read_info^.stream.next_in :=
pBytef(pfile_in_zip_read_info^.read_buffer);
pfile_in_zip_read_info^.stream.avail_in := uInt(uReadThis);
end;
if (pfile_in_zip_read_info^.compression_method=0) then
begin
if (pfile_in_zip_read_info^.stream.avail_out <
pfile_in_zip_read_info^.stream.avail_in) then
uDoCopy := pfile_in_zip_read_info^.stream.avail_out
else
uDoCopy := pfile_in_zip_read_info^.stream.avail_in;
for i:=0 to uDoCopy-1 do
pzByteArray(pfile_in_zip_read_info^.stream.next_out)^[i] :=
pzByteArray(pfile_in_zip_read_info^.stream.next_in)^[i];
pfile_in_zip_read_info^.crc32 := crc32(pfile_in_zip_read_info^.crc32,
pfile_in_zip_read_info^.stream.next_out, uDoCopy);
Dec(pfile_in_zip_read_info^.rest_read_uncompressed, uDoCopy);
Dec(pfile_in_zip_read_info^.stream.avail_in, uDoCopy);
Dec(pfile_in_zip_read_info^.stream.avail_out, uDoCopy);
Inc(pfile_in_zip_read_info^.stream.next_out, uDoCopy);
Inc(pfile_in_zip_read_info^.stream.next_in, uDoCopy);
Inc(pfile_in_zip_read_info^.stream.total_out, uDoCopy);
Inc(iRead, uDoCopy);
end
else
begin
flush := Z_SYNC_FLUSH;
uTotalOutBefore := pfile_in_zip_read_info^.stream.total_out;
bufBefore := pfile_in_zip_read_info^.stream.next_out;
{
if ((pfile_in_zip_read_info^.rest_read_uncompressed =
pfile_in_zip_read_info^.stream.avail_out) and
(pfile_in_zip_read_info^.rest_read_compressed = 0)) then
flush := Z_FINISH;
}
err := inflate(pfile_in_zip_read_info^.stream,flush);
uTotalOutAfter := pfile_in_zip_read_info^.stream.total_out;
uOutThis := uTotalOutAfter-uTotalOutBefore;
pfile_in_zip_read_info^.crc32 :=
crc32(pfile_in_zip_read_info^.crc32,bufBefore, uInt(uOutThis));
Dec(pfile_in_zip_read_info^.rest_read_uncompressed, uOutThis);
Inc(iRead, uInt(uTotalOutAfter - uTotalOutBefore));
if (err=Z_STREAM_END) then
begin
if iRead=0 then
unzReadCurrentFile := UNZ_EOF
else
unzReadCurrentFile := iRead;
exit;
end;
if (err<>Z_OK) then
break;
end;
end; { while }
if (err=Z_OK) then
begin
unzReadCurrentFile := iRead;
exit;
end;
unzReadCurrentFile := err;
{$WARNINGS ON}
end;
{ Give the current position in uncompressed data }
function unztell(afile : unzFile) : z_off_t; { ZEXPORT }
var
s : unz_s_ptr;
pfile_in_zip_read_info : file_in_zip_read_info_s_ptr;
begin
if (afile=NIL) then
begin
unztell := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
pfile_in_zip_read_info := s^.pfile_in_zip_read;
if (pfile_in_zip_read_info=NIL) then
begin
unztell := UNZ_PARAMERROR;
exit;
end;
unztell := z_off_t(pfile_in_zip_read_info^.stream.total_out);
end;
{ return 1 (TRUE) if the end of file was reached, 0 elsewhere }
function unzeof(afile : unzFile) : int;
var
s : unz_s_ptr;
pfile_in_zip_read_info : file_in_zip_read_info_s_ptr;
begin
if (afile=NIL) then
begin
unzeof := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
pfile_in_zip_read_info := s^.pfile_in_zip_read;
if (pfile_in_zip_read_info = NIL) then
begin
unzeof := UNZ_PARAMERROR;
exit;
end;
if (pfile_in_zip_read_info^.rest_read_uncompressed = 0) then
unzeof := 1
else
unzeof := 0;
end;
{ Read extra field from the current file (opened by unzOpenCurrentFile)
This is the local-header version of the extra field (sometimes, there is
more info in the local-header version than in the central-header)
if buf=NIL, it return the size of the local extra field
if buf<>NIL, len is the size of the buffer, the extra header is copied in
buf.
the return value is the number of bytes copied in buf, or (if <0)
the error code }
function unzGetLocalExtrafield (afile : unzFile;
buf : voidp;
len : unsigned) : int;
var
s : unz_s_ptr;
pfile_in_zip_read_info : file_in_zip_read_info_s_ptr;
read_now : uInt;
size_to_read : uLong;
begin
{$WARNINGS OFF}
if (afile=NIL) then
begin
unzGetLocalExtrafield := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
pfile_in_zip_read_info := s^.pfile_in_zip_read;
if (pfile_in_zip_read_info=NIL) then
begin
unzGetLocalExtrafield := UNZ_PARAMERROR;
exit;
end;
size_to_read := (pfile_in_zip_read_info^.size_local_extrafield -
pfile_in_zip_read_info^.pos_local_extrafield);
if (buf=NIL) then
begin
unzGetLocalExtrafield := int(size_to_read);
exit;
end;
if (len>size_to_read) then
read_now := uInt(size_to_read)
else
read_now := uInt(len);
if (read_now=0) then
begin
unzGetLocalExtrafield := 0;
exit;
end;
if (fseek(pfile_in_zip_read_info^.afile,
pfile_in_zip_read_info^.offset_local_extrafield +
pfile_in_zip_read_info^.pos_local_extrafield,SEEK_SET)<>0) then
begin
unzGetLocalExtrafield := UNZ_ERRNO;
exit;
end;
if fread(buf,uInt(size_to_read),1, pfile_in_zip_read_info^.afile)<>1 then
begin
unzGetLocalExtrafield := UNZ_ERRNO;
exit;
end;
unzGetLocalExtrafield := int(read_now);
{$WARNINGS ON}
end;
{ Close the file in zip opened with unzOpenCurrentFile
Return UNZ_CRCERROR if all the file was read but the CRC is not good }
function unzCloseCurrentFile(afile : unzFile) : int; { ZEXPORT }
var
err : int;
s : unz_s_ptr;
pfile_in_zip_read_info : file_in_zip_read_info_s_ptr;
begin
err := UNZ_OK;
if (afile=NIL) then
begin
unzCloseCurrentFile := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
pfile_in_zip_read_info := s^.pfile_in_zip_read;
if (pfile_in_zip_read_info=NIL) then
begin
unzCloseCurrentFile := UNZ_PARAMERROR;
exit;
end;
if (pfile_in_zip_read_info^.rest_read_uncompressed = 0) then
begin
if (pfile_in_zip_read_info^.crc32 <> pfile_in_zip_read_info^.crc32_wait) then
err :=UNZ_CRCERROR;
end;
TRYFREE(pfile_in_zip_read_info^.read_buffer);
pfile_in_zip_read_info^.read_buffer := NIL;
if (pfile_in_zip_read_info^.stream_initialised) then
inflateEnd(pfile_in_zip_read_info^.stream);
pfile_in_zip_read_info^.stream_initialised := false;
TRYFREE(pfile_in_zip_read_info);
s^.pfile_in_zip_read := NIL;
unzCloseCurrentFile := err;
end;
{ Get the global comment string of the ZipFile, in the szComment buffer.
uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0 }
function unzGetGlobalComment (afile : unzFile;
szComment : PChar;
uSizeBuf : uLong) : int; { ZEXPORT }
var
s : unz_s_ptr;
uReadThis : uLong;
begin
if (afile=NIL) then
begin
unzGetGlobalComment := UNZ_PARAMERROR;
exit;
end;
s := unz_s_ptr(afile);
uReadThis := uSizeBuf;
if (uReadThis>s^.gi.size_comment) then
uReadThis := s^.gi.size_comment;
if (fseek(s^.afile,s^.central_pos+22,SEEK_SET)<>0) then
begin
unzGetGlobalComment := UNZ_ERRNO;
exit;
end;
if (uReadThis>0) then
begin
szComment^ := #0;
if fread(szComment, uInt(uReadThis), 1,s^.afile)<>1 then
begin
unzGetGlobalComment := UNZ_ERRNO;
exit;
end;
end;
if ((szComment <> NIL) and (uSizeBuf > s^.gi.size_comment)) then
(szComment+s^.gi.size_comment)^ := #0;
unzGetGlobalComment := int(uReadThis);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -