소스 검색

Merged revisions 7520,7528 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7520 | peter | 2007-05-29 21:55:57 +0200 (Tue, 29 May 2007) | 2 lines

* fix range errors

........
r7528 | peter | 2007-05-30 17:37:18 +0200 (Wed, 30 May 2007) | 2 lines

* support unzip of specified files

........

git-svn-id: branches/fixes_2_2@7534 -

peter 18 년 전
부모
커밋
e0ec1adb8a
1개의 변경된 파일27개의 추가작업 그리고 12개의 파일을 삭제
  1. 27 12
      packages/fcl-base/src/inc/zipper.pp

+ 27 - 12
packages/fcl-base/src/inc/zipper.pp

@@ -908,12 +908,13 @@ Procedure TZipper.GetFileInfo;
 
 Var
    Info : TSearchRec;
-   I       : Word;
+   I       : Longint;
    NewNode : TZipItem;
 
 
 Begin
    For I := 0 to FFiles.Count-1 do
+    begin
      If FindFirst(FFiles[I], STDATTR, Info)=0 then
        try
          NewNode:=TZipItem.Create;
@@ -925,6 +926,7 @@ Begin
        finally
          FindClose(Info);
        end;
+     end;  
 end;
 
 Procedure TZipper.OpenOutput;
@@ -972,17 +974,20 @@ Begin
     Crc32 := 0;
     Compressed_Size := 0;
     Uncompressed_Size := Item.Size;
-    FileName_Length := Length(Item.Name);
+    FileName_Length := 0;
     Extra_Field_Length := 0;
   end ;
 End;
 
 
 Function TZipper.UpdateZipHeader(Item : TZipItem; FZip : TStream; ACRC : LongWord; AMethod : Word) : Boolean;
-
+var
+  ZFileName  : ShortString;
 Begin
+  ZFileName:=Item.Path+Item.Name;
   With LocalHdr do
     begin
+    FileName_Length := Length(ZFileName);
     Compressed_Size := FZip.Size;
     Crc32 := ACRC;
     Compress_method:=AMethod;
@@ -994,7 +999,7 @@ Begin
       end;
     end;
   FOutFile.WriteBuffer(LocalHdr,SizeOf(LocalHdr));
-  FOutFile.WriteBuffer(Item.Name[1],Length(Item.Name));
+  FOutFile.WriteBuffer(ZFileName[1],Length(ZFileName));
 End;
 
 
@@ -1064,7 +1069,7 @@ end;
 Procedure TZipper.ZipOneFile(Item : TZipItem);
 
 Var
-  CRC : Integer;
+  CRC : LongWord;
   ZMethod : Word;
   ZipStream : TStream;
   TmpFileName : String;
@@ -1114,21 +1119,29 @@ Procedure TZipper.ZipAllFiles;
 Var
    Item : TZipItem;
    I : Integer;
-
+   filecnt : integer;
 Begin
+  if FFiles.Count=0 then
+    exit;
   FZipping:=True;
   Try
     GetFileInfo;
     OpenOutput;
     Try
+      filecnt:=0;
       For I:=0 to FFiles.Count-1 do
         begin
-        Item:=FFiles.Objects[i] as TZipItem;
-        ZipOneFile(Item);
+          Item:=FFiles.Objects[i] as TZipItem;
+	  if assigned(Item) then
+	    begin
+              ZipOneFile(Item);
+	      inc(filecnt);
+	    end;  
         end;
-      BuildZipDirectory;
-    Finally
-       CloseOutput;
+      if filecnt>0 then	
+        BuildZipDirectory;
+    finally
+      CloseOutput;
     end;
   finally
     FZipping:=False;
@@ -1357,7 +1370,9 @@ Begin
       For I:=0 to FZipEntries.Count-1 do
         begin
           Item:=FZipEntries[i] as TZipItem;
-          UnZipOneFile(Item);
+	  if (FFiles=nil) or
+	     (FFiles.IndexOf(Item.Name)<>-1) then
+            UnZipOneFile(Item);
         end;
     Finally
        CloseInput;