minizip.pas 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. program MiniZip;
  2. { minizip demo package by Gilles Vollant
  3. Usage : minizip [-o] file.zip [files_to_add]
  4. a file.zip file is created, all files listed in [files_to_add] are added
  5. to the new .zip file.
  6. -o an existing .zip file with be overwritten without warning
  7. Pascal tranlastion
  8. Copyright (C) 2000 by Jacques Nomssi Nzali
  9. For conditions of distribution and use, see copyright notice in readme.txt
  10. }
  11. uses
  12. SysUtils, zlib, ctypes, ziputils, zip;
  13. const
  14. WRITEBUFFERSIZE = Z_BUFSIZE;
  15. MAXFILENAME = Z_MAXFILENAMEINZIP;
  16. function filetime(f: PChar; { name of file to get info on }
  17. var tmzip: tm_zip): cuLong; { return value: access, modific. and creation times }
  18. var
  19. dtrec: TDateTime; { For Pack/UnpackTime}
  20. stime: TSystemTime;
  21. begin
  22. if not FileExists(f) then exit;
  23. dtrec := FileDateToDateTime(FileAge(f));
  24. DateTimeToSystemTime(dtrec, stime);
  25. tmzip.tm_sec := stime.second;
  26. tmzip.tm_min := stime.minute;
  27. tmzip.tm_hour := stime.hour;
  28. tmzip.tm_mday := stime.day;
  29. tmzip.tm_mon := stime.month;
  30. tmzip.tm_year := stime.year;
  31. filetime := 0;
  32. end;
  33. procedure do_banner;
  34. begin
  35. WriteLn('MiniZip 0.15, demo package written by Gilles Vollant');
  36. WriteLn('Pascal port by Jacques Nomssi Nzali');
  37. WriteLn('more info at http://www.tu-chemnitz.de/~nomssi/paszlib.html');
  38. WriteLn;
  39. end;
  40. procedure do_help;
  41. begin
  42. WriteLn('Usage : minizip [-o] file.zip [files_to_add]');
  43. WriteLn;
  44. end;
  45. function main: longint;
  46. var
  47. answer: string[128];
  48. argstr: string;
  49. buf: pointer;
  50. c: char;
  51. dot_found: longint;
  52. err: longint;
  53. errclose: longint;
  54. filenameinzip: PChar;
  55. filename_try: array[0..MAXFILENAME - 1] of char;
  56. fin: FILEptr;
  57. i: longint;
  58. len: longint;
  59. opt_compress_level: longint;
  60. opt_overwrite: longint;
  61. p: PChar;
  62. rep: char;
  63. size_buf: longint;
  64. size_read: longint;
  65. zf: zipFile;
  66. zi: zip_fileinfo;
  67. zipfilenamearg: longint;
  68. zipok: longint;
  69. begin
  70. opt_overwrite := 0;
  71. opt_compress_level := Z_DEFAULT_COMPRESSION;
  72. zipfilenamearg := 0;
  73. err := 0;
  74. main := 0;
  75. do_banner;
  76. if (ParamCount = 0) then
  77. begin
  78. do_help;
  79. main := 0;
  80. exit;
  81. end
  82. else
  83. for i := 1 to ParamCount - 1 + 1 do
  84. begin
  85. argstr := ParamStr(i) + #0;
  86. if (argstr[1] = '-') then
  87. begin
  88. p := @argstr[1 + 1]; {const char *p=argv[i]+1;}
  89. while (p^ <> #0) do
  90. begin
  91. c := p^;
  92. Inc(p);
  93. if (c = 'o') or (c = 'O') then
  94. opt_overwrite := 1;
  95. if (c >= '0') and (c <= '9') then
  96. opt_compress_level := byte(c) - byte('0');
  97. end;
  98. end
  99. else
  100. if (zipfilenamearg = 0) then
  101. zipfilenamearg := i;
  102. end;
  103. size_buf := WRITEBUFFERSIZE;
  104. buf := AllocMem(size_buf);
  105. if (buf = nil) then
  106. begin
  107. WriteLn('Error allocating memory');
  108. main := ZIP_INTERNALERROR;
  109. exit;
  110. end;
  111. if (zipfilenamearg = 0) then
  112. zipok := 0
  113. else
  114. begin
  115. dot_found := 0;
  116. zipok := 1;
  117. argstr := ParamStr(zipfilenamearg) + #0;
  118. strcopy(filename_try, PChar(@argstr[1]));
  119. len := strlen(filename_try);
  120. for i := 0 to len - 1 do
  121. if (filename_try[i] = '.') then
  122. dot_found := 1;
  123. if (dot_found = 0) then
  124. strcat(filename_try, '.zip');
  125. if (opt_overwrite = 0) then
  126. if FileExists(filename_try) then
  127. begin
  128. repeat
  129. WriteLn('The file ', filename_try,
  130. ' exist. Overwrite ? [y]es, [n]o : ');
  131. ReadLn(answer);
  132. rep := answer[1];
  133. if (rep >= 'a') and (rep <= 'z') then
  134. Dec(rep, $20);
  135. until (rep = 'Y') or (rep = 'N');
  136. if (rep = 'N') then
  137. zipok := 0;
  138. end;
  139. end;
  140. if (zipok = 1) then
  141. begin
  142. zf := zipOpen(filename_try, 0);
  143. if (zf = nil) then
  144. begin
  145. WriteLn('error opening ', filename_try);
  146. err := ZIP_ERRNO;
  147. end
  148. else
  149. WriteLn('creating ', filename_try);
  150. i := zipfilenamearg + 1;
  151. while (i <= ParamCount) and (err = ZIP_OK) do
  152. begin
  153. argstr := ParamStr(i) + #0;
  154. if (argstr[1] <> '-') and (argstr[1] <> '/') then
  155. begin
  156. filenameinzip := PChar(@argstr[1]);
  157. zi.tmz_date.tm_sec := 0;
  158. zi.tmz_date.tm_min := 0;
  159. zi.tmz_date.tm_hour := 0;
  160. zi.tmz_date.tm_mday := 0;
  161. zi.tmz_date.tm_min := 0;
  162. zi.tmz_date.tm_year := 0;
  163. zi.dosDate := 0;
  164. zi.internal_fa := 0;
  165. zi.external_fa := 0;
  166. filetime(filenameinzip, zi.tmz_date);
  167. if (opt_compress_level <> 0) then
  168. err := zipOpenNewFileInZip(zf, filenameinzip, @zi,
  169. nil, 0, nil, 0, nil { comment}, Z_DEFLATED, opt_compress_level)
  170. else
  171. err := zipOpenNewFileInZip(zf, filenameinzip, @zi,
  172. nil, 0, nil, 0, nil, 0, opt_compress_level);
  173. if (err <> ZIP_OK) then
  174. WriteLn('error in opening ', filenameinzip, ' in zipfile')
  175. else
  176. begin
  177. fin := fopen(filenameinzip, fopenread);
  178. if (fin = nil) then
  179. begin
  180. err := ZIP_ERRNO;
  181. WriteLn('error in opening ', filenameinzip, ' for reading');
  182. end;
  183. if (err = ZIP_OK) then
  184. repeat
  185. err := ZIP_OK;
  186. size_read := fread(buf, 1, size_buf, fin);
  187. if (size_read < size_buf) then
  188. if feof(fin) = 0 then
  189. begin
  190. WriteLn('error in reading ', filenameinzip);
  191. err := ZIP_ERRNO;
  192. end;
  193. if (size_read > 0) then
  194. begin
  195. err := zipWriteInFileInZip(zf, buf, size_read);
  196. if (err < 0) then
  197. WriteLn('error in writing ', filenameinzip, ' in the zipfile');
  198. end;
  199. until (err <> ZIP_OK) or (size_read = 0);
  200. fclose(fin);
  201. end;
  202. if (err < 0) then
  203. err := ZIP_ERRNO
  204. else
  205. begin
  206. err := zipCloseFileInZip(zf);
  207. if (err <> ZIP_OK) then
  208. WriteLn('error in closing ', filenameinzip, ' in the zipfile');
  209. end;
  210. Inc(i);
  211. end; { while }
  212. end; { if }
  213. errclose := zipClose(zf, nil);
  214. if (errclose <> ZIP_OK) then
  215. WriteLn('error in closing ', filename_try);
  216. end;
  217. FreeMem(buf); {FreeMem(buf, size_buf);}
  218. end;
  219. begin
  220. main;
  221. Write('Done...');
  222. ReadLn;
  223. end.