Zip.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. namespace FastReport.Utils
  6. {
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. public class ZipArchive
  11. {
  12. string rootFolder;
  13. string errors;
  14. List<ZipFileItem> fileList;
  15. List<ZipLocalFile> fileObjects;
  16. string comment;
  17. private uint CopyStream(Stream source, Stream target)
  18. {
  19. source.Position = 0;
  20. int bufflength = 8192;
  21. uint crc = Crc32.Begin();
  22. byte[] buff = new byte[bufflength];
  23. int i;
  24. while ((i = source.Read(buff, 0, bufflength)) > 0)
  25. {
  26. target.Write(buff, 0, i);
  27. crc = Crc32.Update(crc, buff, 0, i);
  28. }
  29. return Crc32.End(crc);
  30. }
  31. /// <summary>
  32. /// Clear all files in archive.
  33. /// </summary>
  34. public void Clear()
  35. {
  36. foreach (ZipFileItem item in fileList)
  37. item.Clear();
  38. foreach (ZipLocalFile item in fileObjects)
  39. item.Clear();
  40. fileList.Clear();
  41. fileObjects.Clear();
  42. errors = "";
  43. rootFolder = "";
  44. comment = "";
  45. }
  46. /// <summary>
  47. /// Check for exisiting file in archive.
  48. /// </summary>
  49. /// <param name="FileName"></param>
  50. /// <returns></returns>
  51. public bool FileExists(string FileName)
  52. {
  53. foreach (ZipFileItem item in fileList)
  54. {
  55. if (item.Name == FileName)
  56. return true;
  57. }
  58. return false;
  59. }
  60. /// <summary>
  61. /// Adds the file form disk to the archive.
  62. /// </summary>
  63. /// <param name="FileName"></param>
  64. public void AddFile(string FileName)
  65. {
  66. if (!FileExists(FileName)) // check for exisiting file in archive
  67. {
  68. if (File.Exists(FileName))
  69. {
  70. fileList.Add(new ZipFileItem(FileName));
  71. if (rootFolder == String.Empty)
  72. rootFolder = Path.GetDirectoryName(FileName);
  73. }
  74. else
  75. errors += "File " + FileName + " not found\r";
  76. }
  77. }
  78. /// <summary>
  79. /// Adds all files from directory (recursive) on the disk to the archive.
  80. /// </summary>
  81. /// <param name="DirName"></param>
  82. public void AddDir(string DirName)
  83. {
  84. List<string> files = new List<string>();
  85. files.AddRange(Directory.GetFiles(DirName));
  86. foreach (string file in files)
  87. {
  88. if ((File.GetAttributes(file) & FileAttributes.Hidden) != 0)
  89. continue;
  90. AddFile(file);
  91. }
  92. List<string> folders = new List<string>();
  93. folders.AddRange(Directory.GetDirectories(DirName));
  94. foreach (string folder in folders)
  95. {
  96. if ((File.GetAttributes(folder) & FileAttributes.Hidden) != 0)
  97. continue;
  98. AddDir(folder);
  99. }
  100. }
  101. /// <summary>
  102. /// Adds the stream to the archive.
  103. /// </summary>
  104. /// <param name="fileName"></param>
  105. /// <param name="stream"></param>
  106. public void AddStream(string fileName, Stream stream)
  107. {
  108. if (!FileExists(fileName)) // check for exisiting file in archive
  109. fileList.Add(new ZipFileItem(fileName, stream));
  110. }
  111. private void AddStreamToZip(Stream stream, ZipLocalFile ZipFile)
  112. {
  113. if (stream.Length > 128)
  114. {
  115. using (DeflateStream deflate = new DeflateStream(ZipFile.FileData, CompressionMode.Compress, true))
  116. ZipFile.LocalFileHeader.Crc32 = CopyStream(stream, deflate);
  117. ZipFile.LocalFileHeader.CompressionMethod = 8;
  118. }
  119. else
  120. {
  121. ZipFile.LocalFileHeader.Crc32 = CopyStream(stream, ZipFile.FileData);
  122. ZipFile.LocalFileHeader.CompressionMethod = 0;
  123. }
  124. ZipFile.LocalFileHeader.CompressedSize = (uint)ZipFile.FileData.Length;
  125. ZipFile.LocalFileHeader.UnCompressedSize = (uint)stream.Length;
  126. }
  127. /// <summary>
  128. /// Creates the zip and writes it to rhe Stream
  129. /// </summary>
  130. /// <param name="Stream"></param>
  131. public void SaveToStream(Stream Stream)
  132. {
  133. ZipLocalFile ZipFile;
  134. ZipCentralDirectory ZipDir;
  135. ZipFileHeader ZipFileHeader;
  136. long CentralStartPos, CentralEndPos;
  137. for (int i = 0; i < fileList.Count; i++)
  138. {
  139. ZipFile = new ZipLocalFile();
  140. using (ZipFile.FileData = new MemoryStream())
  141. {
  142. if (fileList[i].Disk)
  143. {
  144. ZipFile.LocalFileHeader.FileName = fileList[i].Name.Replace(rootFolder + Path.DirectorySeparatorChar, "");
  145. using (FileStream file = new FileStream(fileList[i].Name, FileMode.Open))
  146. AddStreamToZip(file, ZipFile);
  147. }
  148. else
  149. {
  150. ZipFile.LocalFileHeader.FileName = fileList[i].Name;
  151. fileList[i].Stream.Position = 0;
  152. AddStreamToZip(fileList[i].Stream, ZipFile);
  153. }
  154. ZipFile.Offset = (uint)Stream.Position;
  155. ZipFile.LocalFileHeader.LastModFileDate = fileList[i].FileDateTime;
  156. ZipFile.SaveToStream(Stream);
  157. }
  158. ZipFile.FileData = null;
  159. fileObjects.Add(ZipFile);
  160. }
  161. CentralStartPos = Stream.Position;
  162. for (int i = 0; i < fileObjects.Count; i++)
  163. {
  164. ZipFile = fileObjects[i];
  165. ZipFileHeader = new ZipFileHeader();
  166. ZipFileHeader.CompressionMethod = ZipFile.LocalFileHeader.CompressionMethod;
  167. ZipFileHeader.LastModFileDate = ZipFile.LocalFileHeader.LastModFileDate;
  168. ZipFileHeader.GeneralPurpose = ZipFile.LocalFileHeader.GeneralPurpose;
  169. ZipFileHeader.Crc32 = ZipFile.LocalFileHeader.Crc32;
  170. ZipFileHeader.CompressedSize = ZipFile.LocalFileHeader.CompressedSize;
  171. ZipFileHeader.UnCompressedSize = ZipFile.LocalFileHeader.UnCompressedSize;
  172. ZipFileHeader.RelativeOffsetLocalHeader = ZipFile.Offset;
  173. ZipFileHeader.FileName = ZipFile.LocalFileHeader.FileName;
  174. ZipFileHeader.SaveToStream(Stream);
  175. }
  176. CentralEndPos = Stream.Position;
  177. ZipDir = new ZipCentralDirectory();
  178. ZipDir.TotalOfEntriesCentralDirOnDisk = (ushort)fileList.Count;
  179. ZipDir.TotalOfEntriesCentralDir = (ushort)fileList.Count;
  180. ZipDir.SizeOfCentralDir = (uint)(CentralEndPos - CentralStartPos);
  181. ZipDir.OffsetStartingDiskDir = (uint)CentralStartPos;
  182. ZipDir.SaveToStream(Stream);
  183. }
  184. /// <summary>
  185. /// Creates the ZIP archive and writes it to the file.
  186. /// </summary>
  187. /// <param name="FileName"></param>
  188. public void SaveToFile(string FileName)
  189. {
  190. using (FileStream file = new FileStream(FileName, FileMode.Create))
  191. SaveToStream(file);
  192. }
  193. /// <summary>
  194. /// Gets or sets the Root Folder.
  195. /// </summary>
  196. public string RootFolder
  197. {
  198. get { return rootFolder; }
  199. set { rootFolder = value; }
  200. }
  201. /// <summary>
  202. /// Gets or sets the errors.
  203. /// </summary>
  204. public string Errors
  205. {
  206. get { return errors; }
  207. set { errors = value; }
  208. }
  209. /// <summary>
  210. /// Gets or sets the commentary to the archive.
  211. /// </summary>
  212. public string Comment
  213. {
  214. get { return comment; }
  215. set { comment = value; }
  216. }
  217. /// <summary>
  218. /// Gets count of files in archive.
  219. /// </summary>
  220. public int FileCount
  221. {
  222. get { return fileList.Count; }
  223. }
  224. /// <summary>
  225. /// Creates the new zip archive.
  226. /// </summary>
  227. public ZipArchive()
  228. {
  229. fileList = new List<ZipFileItem>();
  230. fileObjects = new List<ZipLocalFile>();
  231. Clear();
  232. }
  233. }
  234. internal class ZipFileItem
  235. {
  236. private string name;
  237. private Stream stream;
  238. private bool disk;
  239. private uint fileDateTime;
  240. private uint GetDosDateTime(DateTime date)
  241. {
  242. return (uint)(
  243. ((date.Year - 1980 & 0x7f) << 25) |
  244. ((date.Month & 0xF) << 21) |
  245. ((date.Day & 0x1F) << 16) |
  246. ((date.Hour & 0x1F) << 11) |
  247. ((date.Minute & 0x3F) << 5) |
  248. (date.Second >> 1));
  249. }
  250. public string Name
  251. {
  252. get { return name; }
  253. set { name = value; }
  254. }
  255. public Stream Stream
  256. {
  257. get { return stream; }
  258. }
  259. public bool Disk
  260. {
  261. get { return disk; }
  262. set { disk = value; }
  263. }
  264. public uint FileDateTime
  265. {
  266. get { return fileDateTime; }
  267. set { fileDateTime = value; }
  268. }
  269. public void Clear()
  270. {
  271. if (stream != null)
  272. {
  273. stream.Dispose();
  274. stream = null;
  275. }
  276. }
  277. public ZipFileItem()
  278. {
  279. stream = new MemoryStream();
  280. fileDateTime = GetDosDateTime(SystemFake.DateTime.Now);
  281. disk = false;
  282. }
  283. public ZipFileItem(string fileName, Stream stream)
  284. {
  285. this.stream = stream;
  286. name = fileName;
  287. fileDateTime = GetDosDateTime(SystemFake.DateTime.Now);
  288. disk = false;
  289. }
  290. public ZipFileItem(string fileName)
  291. {
  292. name = fileName;
  293. fileDateTime = GetDosDateTime(File.GetLastWriteTime(fileName));
  294. disk = true;
  295. }
  296. }
  297. internal class ZipLocalFileHeader
  298. {
  299. private uint localFileHeaderSignature;
  300. private ushort version;
  301. private ushort generalPurpose;
  302. private ushort compressionMethod;
  303. private uint crc32;
  304. private uint lastModFileDate;
  305. private uint compressedSize;
  306. private uint unCompressedSize;
  307. private string extraField;
  308. private string fileName;
  309. private ushort fileNameLength;
  310. private ushort extraFieldLength;
  311. public void SaveToStream(Stream Stream)
  312. {
  313. Stream.Write(BitConverter.GetBytes(localFileHeaderSignature), 0, 4);
  314. Stream.Write(BitConverter.GetBytes(version), 0, 2);
  315. Stream.Write(BitConverter.GetBytes(generalPurpose), 0, 2);
  316. Stream.Write(BitConverter.GetBytes(compressionMethod), 0, 2);
  317. Stream.Write(BitConverter.GetBytes(lastModFileDate), 0, 4);
  318. Stream.Write(BitConverter.GetBytes(crc32), 0, 4);
  319. Stream.Write(BitConverter.GetBytes(compressedSize), 0, 4);
  320. Stream.Write(BitConverter.GetBytes(unCompressedSize), 0, 4);
  321. Stream.Write(BitConverter.GetBytes(fileNameLength), 0, 2);
  322. Stream.Write(BitConverter.GetBytes(extraFieldLength), 0, 2);
  323. if (fileNameLength > 0)
  324. Stream.Write(System.Text.Encoding.UTF8.GetBytes(fileName), 0, fileNameLength);
  325. if (extraFieldLength > 0)
  326. Stream.Write(Converter.StringToByteArray(extraField), 0, extraFieldLength);
  327. }
  328. public uint LocalFileHeaderSignature
  329. {
  330. get { return localFileHeaderSignature; }
  331. }
  332. public ushort Version
  333. {
  334. get { return version; }
  335. set { version = value; }
  336. }
  337. public ushort GeneralPurpose
  338. {
  339. get { return generalPurpose; }
  340. set { generalPurpose = value; }
  341. }
  342. public ushort CompressionMethod
  343. {
  344. get { return compressionMethod; }
  345. set { compressionMethod = value; }
  346. }
  347. public uint LastModFileDate
  348. {
  349. get { return lastModFileDate; }
  350. set { lastModFileDate = value; }
  351. }
  352. public uint Crc32
  353. {
  354. get { return crc32; }
  355. set { crc32 = value; }
  356. }
  357. public uint CompressedSize
  358. {
  359. get { return compressedSize; }
  360. set { compressedSize = value; }
  361. }
  362. public uint UnCompressedSize
  363. {
  364. get { return unCompressedSize; }
  365. set { unCompressedSize = value; }
  366. }
  367. public ushort FileNameLength
  368. {
  369. get { return fileNameLength; }
  370. set { fileNameLength = value; }
  371. }
  372. public ushort ExtraFieldLength
  373. {
  374. get { return extraFieldLength; }
  375. set { extraFieldLength = value; }
  376. }
  377. public string FileName
  378. {
  379. get { return fileName; }
  380. set
  381. {
  382. fileName = value.Replace('\\', '/');
  383. fileNameLength = (ushort)System.Text.Encoding.UTF8.GetBytes(value).Length;
  384. }
  385. }
  386. public string ExtraField
  387. {
  388. get { return extraField; }
  389. set
  390. {
  391. extraField = value;
  392. extraFieldLength = (ushort)value.Length;
  393. }
  394. }
  395. // constructor
  396. public ZipLocalFileHeader()
  397. {
  398. localFileHeaderSignature = 0x04034b50;
  399. version = 20;
  400. generalPurpose = 0x800;
  401. compressionMethod = 0;
  402. crc32 = 0;
  403. lastModFileDate = 0;
  404. compressedSize = 0;
  405. unCompressedSize = 0;
  406. extraField = "";
  407. fileName = "";
  408. fileNameLength = 0;
  409. extraFieldLength = 0;
  410. }
  411. }
  412. internal class ZipCentralDirectory
  413. {
  414. private uint endOfChentralDirSignature;
  415. private ushort numberOfTheDisk;
  416. private ushort totalOfEntriesCentralDirOnDisk;
  417. private ushort numberOfTheDiskStartCentralDir;
  418. private ushort totalOfEntriesCentralDir;
  419. private uint sizeOfCentralDir;
  420. private uint offsetStartingDiskDir;
  421. private string comment;
  422. private ushort commentLength;
  423. public void SaveToStream(Stream Stream)
  424. {
  425. Stream.Write(BitConverter.GetBytes(endOfChentralDirSignature), 0, 4);
  426. Stream.Write(BitConverter.GetBytes(numberOfTheDisk), 0, 2);
  427. Stream.Write(BitConverter.GetBytes(numberOfTheDiskStartCentralDir), 0, 2);
  428. Stream.Write(BitConverter.GetBytes(totalOfEntriesCentralDirOnDisk), 0, 2);
  429. Stream.Write(BitConverter.GetBytes(totalOfEntriesCentralDir), 0, 2);
  430. Stream.Write(BitConverter.GetBytes(sizeOfCentralDir), 0, 4);
  431. Stream.Write(BitConverter.GetBytes(offsetStartingDiskDir), 0, 4);
  432. Stream.Write(BitConverter.GetBytes(commentLength), 0, 2);
  433. if (commentLength > 0)
  434. Stream.Write(Converter.StringToByteArray(comment), 0, commentLength);
  435. }
  436. public uint EndOfChentralDirSignature
  437. {
  438. get { return endOfChentralDirSignature; }
  439. }
  440. public ushort NumberOfTheDisk
  441. {
  442. get { return numberOfTheDisk; }
  443. set { numberOfTheDisk = value; }
  444. }
  445. public ushort NumberOfTheDiskStartCentralDir
  446. {
  447. get { return numberOfTheDiskStartCentralDir; }
  448. set { numberOfTheDiskStartCentralDir = value; }
  449. }
  450. public ushort TotalOfEntriesCentralDirOnDisk
  451. {
  452. get { return totalOfEntriesCentralDirOnDisk; }
  453. set { totalOfEntriesCentralDirOnDisk = value; }
  454. }
  455. public ushort TotalOfEntriesCentralDir
  456. {
  457. get { return totalOfEntriesCentralDir; }
  458. set { totalOfEntriesCentralDir = value; }
  459. }
  460. public uint SizeOfCentralDir
  461. {
  462. get { return sizeOfCentralDir; }
  463. set { sizeOfCentralDir = value; }
  464. }
  465. public uint OffsetStartingDiskDir
  466. {
  467. get { return offsetStartingDiskDir; }
  468. set { offsetStartingDiskDir = value; }
  469. }
  470. public ushort CommentLength
  471. {
  472. get { return commentLength; }
  473. set { commentLength = value; }
  474. }
  475. public string Comment
  476. {
  477. get { return comment; }
  478. set
  479. {
  480. comment = value;
  481. commentLength = (ushort)value.Length;
  482. }
  483. }
  484. // constructor
  485. public ZipCentralDirectory()
  486. {
  487. endOfChentralDirSignature = 0x06054b50;
  488. numberOfTheDisk = 0;
  489. numberOfTheDiskStartCentralDir = 0;
  490. totalOfEntriesCentralDirOnDisk = 0;
  491. totalOfEntriesCentralDir = 0;
  492. sizeOfCentralDir = 0;
  493. offsetStartingDiskDir = 0;
  494. commentLength = 0;
  495. comment = "";
  496. }
  497. }
  498. internal class ZipFileHeader
  499. {
  500. private uint centralFileHeaderSignature;
  501. private uint relativeOffsetLocalHeader;
  502. private uint unCompressedSize;
  503. private uint compressedSize;
  504. private uint crc32;
  505. private uint externalFileAttribute;
  506. private string extraField;
  507. private string fileComment;
  508. private string fileName;
  509. private ushort compressionMethod;
  510. private ushort diskNumberStart;
  511. private uint lastModFileDate;
  512. private ushort versionMadeBy;
  513. private ushort generalPurpose;
  514. private ushort fileNameLength;
  515. private ushort internalFileAttribute;
  516. private ushort extraFieldLength;
  517. private ushort versionNeeded;
  518. private ushort fileCommentLength;
  519. public void SaveToStream(Stream Stream)
  520. {
  521. Stream.Write(BitConverter.GetBytes(centralFileHeaderSignature), 0, 4);
  522. Stream.Write(BitConverter.GetBytes(versionMadeBy), 0, 2);
  523. Stream.Write(BitConverter.GetBytes(versionNeeded), 0, 2);
  524. Stream.Write(BitConverter.GetBytes(generalPurpose), 0, 2);
  525. Stream.Write(BitConverter.GetBytes(compressionMethod), 0, 2);
  526. Stream.Write(BitConverter.GetBytes(lastModFileDate), 0, 4);
  527. Stream.Write(BitConverter.GetBytes(crc32), 0, 4);
  528. Stream.Write(BitConverter.GetBytes(compressedSize), 0, 4);
  529. Stream.Write(BitConverter.GetBytes(unCompressedSize), 0, 4);
  530. Stream.Write(BitConverter.GetBytes(fileNameLength), 0, 2);
  531. Stream.Write(BitConverter.GetBytes(extraFieldLength), 0, 2);
  532. Stream.Write(BitConverter.GetBytes(fileCommentLength), 0, 2);
  533. Stream.Write(BitConverter.GetBytes(diskNumberStart), 0, 2);
  534. Stream.Write(BitConverter.GetBytes(internalFileAttribute), 0, 2);
  535. Stream.Write(BitConverter.GetBytes(externalFileAttribute), 0, 4);
  536. Stream.Write(BitConverter.GetBytes(relativeOffsetLocalHeader), 0, 4);
  537. Stream.Write(System.Text.Encoding.UTF8.GetBytes(fileName), 0, fileNameLength);
  538. Stream.Write(Converter.StringToByteArray(extraField), 0, extraFieldLength);
  539. Stream.Write(Converter.StringToByteArray(fileComment), 0, fileCommentLength);
  540. }
  541. public uint CentralFileHeaderSignature
  542. {
  543. get { return centralFileHeaderSignature; }
  544. }
  545. public ushort VersionMadeBy
  546. {
  547. get { return versionMadeBy; }
  548. }
  549. public ushort VersionNeeded
  550. {
  551. get { return versionNeeded; }
  552. }
  553. public ushort GeneralPurpose
  554. {
  555. get { return generalPurpose; }
  556. set { generalPurpose = value; }
  557. }
  558. public ushort CompressionMethod
  559. {
  560. get { return compressionMethod; }
  561. set { compressionMethod = value; }
  562. }
  563. public uint LastModFileDate
  564. {
  565. get { return lastModFileDate; }
  566. set { lastModFileDate = value; }
  567. }
  568. public uint Crc32
  569. {
  570. get { return crc32; }
  571. set { crc32 = value; }
  572. }
  573. public uint CompressedSize
  574. {
  575. get { return compressedSize; }
  576. set { compressedSize = value; }
  577. }
  578. public uint UnCompressedSize
  579. {
  580. get { return unCompressedSize; }
  581. set { unCompressedSize = value; }
  582. }
  583. public ushort FileNameLength
  584. {
  585. get { return fileNameLength; }
  586. set { fileNameLength = value; }
  587. }
  588. public ushort ExtraFieldLength
  589. {
  590. get { return extraFieldLength; }
  591. set { extraFieldLength = value; }
  592. }
  593. public ushort FileCommentLength
  594. {
  595. get { return fileCommentLength; }
  596. set { fileCommentLength = value; }
  597. }
  598. public ushort DiskNumberStart
  599. {
  600. get { return diskNumberStart; }
  601. set { diskNumberStart = value; }
  602. }
  603. public ushort InternalFileAttribute
  604. {
  605. get { return internalFileAttribute; }
  606. set { internalFileAttribute = value; }
  607. }
  608. public uint ExternalFileAttribute
  609. {
  610. get { return externalFileAttribute; }
  611. set { externalFileAttribute = value; }
  612. }
  613. public uint RelativeOffsetLocalHeader
  614. {
  615. get { return relativeOffsetLocalHeader; }
  616. set { relativeOffsetLocalHeader = value; }
  617. }
  618. public string FileName
  619. {
  620. get { return fileName; }
  621. set
  622. {
  623. fileName = value.Replace('\\', '/');
  624. fileNameLength = (ushort)System.Text.Encoding.UTF8.GetBytes(value).Length;
  625. }
  626. }
  627. public string ExtraField
  628. {
  629. get { return extraField; }
  630. set
  631. {
  632. extraField = value;
  633. extraFieldLength = (ushort)value.Length;
  634. }
  635. }
  636. public string FileComment
  637. {
  638. get { return fileComment; }
  639. set
  640. {
  641. fileComment = value;
  642. fileCommentLength = (ushort)value.Length;
  643. }
  644. }
  645. // constructor
  646. public ZipFileHeader()
  647. {
  648. centralFileHeaderSignature = 0x02014b50;
  649. relativeOffsetLocalHeader = 0;
  650. unCompressedSize = 0;
  651. compressedSize = 0;
  652. crc32 = 0;
  653. externalFileAttribute = 0;
  654. extraField = "";
  655. fileComment = "";
  656. fileName = "";
  657. compressionMethod = 0;
  658. diskNumberStart = 0;
  659. lastModFileDate = 0;
  660. versionMadeBy = 20;
  661. generalPurpose = 0x800;
  662. fileNameLength = 0;
  663. internalFileAttribute = 0;
  664. extraFieldLength = 0;
  665. versionNeeded = 20;
  666. fileCommentLength = 0;
  667. }
  668. }
  669. internal class ZipLocalFile
  670. {
  671. ZipLocalFileHeader localFileHeader;
  672. MemoryStream fileData;
  673. uint offset;
  674. public void SaveToStream(Stream Stream)
  675. {
  676. localFileHeader.SaveToStream(Stream);
  677. fileData.Position = 0;
  678. fileData.WriteTo(Stream);
  679. fileData.Dispose();
  680. fileData = null;
  681. }
  682. public ZipLocalFileHeader LocalFileHeader
  683. {
  684. get { return localFileHeader; }
  685. }
  686. public MemoryStream FileData
  687. {
  688. get { return fileData; }
  689. set { fileData = value; }
  690. }
  691. public uint Offset
  692. {
  693. get { return offset; }
  694. set { offset = value; }
  695. }
  696. public void Clear()
  697. {
  698. if (fileData != null)
  699. {
  700. fileData.Dispose();
  701. fileData = null;
  702. }
  703. }
  704. // constructor
  705. public ZipLocalFile()
  706. {
  707. localFileHeader = new ZipLocalFileHeader();
  708. offset = 0;
  709. }
  710. }
  711. }