/BackupLibrary/ZipClass.cs

http://prometheus.codeplex.com · C# · 306 lines · 199 code · 60 blank · 47 comment · 26 complexity · 7d9d7a94b72ba07cad4606b34a53fdcf MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using ICSharpCode.SharpZipLib.Checksums;
  7. using ICSharpCode.SharpZipLib.Zip;
  8. using ICSharpCode.SharpZipLib.GZip;
  9. namespace BackupLibrary
  10. {
  11. public class ZipClass
  12. {
  13. private int mCompressionLevel = 6;
  14. public int CompressionLevel
  15. {
  16. get { return mCompressionLevel; }
  17. set { mCompressionLevel = value; }
  18. }
  19. /// <summary>
  20. /// Diese Funktion komprimiert alle Dateien in einem Ordner
  21. /// </summary>
  22. /// <param name="InputDir">Der Ordner der komprimiert werden soll</param>
  23. /// <param name="FileName">Gibt den Namen an nach dem die ZIP Datei benannt werden soll</param>
  24. /// <param name="OutputDir">Gibt das Ziel für die ZIP Datei an. Wenn kein Ziel übergeben wurde wird die Datei im Parent Ordner erstellt</param>
  25. public void CompressDirectory(string InputDir, string FileName, string OutputDir)
  26. {
  27. List<string> Files = new List<string>();
  28. string RelativePath = null;
  29. GetAllFiles(InputDir, ref Files);
  30. if (string.IsNullOrEmpty(OutputDir)) OutputDir = Path.GetDirectoryName(InputDir);
  31. if (Directory.Exists(OutputDir) == false) Directory.CreateDirectory(OutputDir);
  32. FileStream ZFS = new FileStream(OutputDir + "\\" + FileName, FileMode.Create);
  33. ICSharpCode.SharpZipLib.Zip.ZipOutputStream ZOut = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(ZFS);
  34. ZOut.SetLevel(6);
  35. ICSharpCode.SharpZipLib.Zip.ZipEntry ZipEntry = default(ICSharpCode.SharpZipLib.Zip.ZipEntry);
  36. byte[] Buffer = new byte[4097];
  37. int ByteLen = 0;
  38. FileStream FS = null;
  39. int ParentDirLen = InputDir.Length + 1;
  40. for (int i = 0; i <= Files.Count - 1; i++)
  41. {
  42. //Relativen Pfad für die Zip Datei erstellen
  43. RelativePath = Files[i].Substring(ParentDirLen);
  44. //ZipEntry erstellen
  45. ZipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(RelativePath);
  46. ZipEntry.DateTime = System.DateTime.Now;
  47. //Eintrag hinzufügen
  48. ZOut.PutNextEntry(ZipEntry);
  49. //Datei in den Stream schreiben
  50. FS = new FileStream(Files[i], FileMode.Open, FileAccess.Read, FileShare.Read);
  51. do
  52. {
  53. ByteLen = FS.Read(Buffer, 0, Buffer.Length);
  54. ZOut.Write(Buffer, 0, ByteLen);
  55. }
  56. while (!(ByteLen <= 0));
  57. FS.Close();
  58. }
  59. ZOut.Finish();
  60. ZOut.Close();
  61. ZFS.Close();
  62. }
  63. /// <summary>
  64. /// Diese Funktion komprimiert alle Dateien in einem Ordner
  65. /// </summary>
  66. /// <param name="InputDir">Der Ordner der komprimiert werden soll</param>
  67. /// <param name="FileName">Gibt den Namen an nach dem die ZIP Datei benannt werden soll</param>
  68. /// <param name="OutputDir">Gibt das Ziel für die ZIP Datei an. Wenn kein Ziel übergeben wurde wird die Datei im Parent Ordner erstellt</param>
  69. public void CompressDirectory(string InputDir, string FileName, string OutputDir, string Password)
  70. {
  71. List<string> Files = new List<string>();
  72. string RelativePath = null;
  73. GetAllFiles(InputDir, ref Files);
  74. if (string.IsNullOrEmpty(OutputDir)) OutputDir = Path.GetDirectoryName(InputDir);
  75. if (Directory.Exists(OutputDir) == false) Directory.CreateDirectory(OutputDir);
  76. FileStream ZFS = new FileStream(OutputDir + "\\" + FileName, FileMode.Create);
  77. ICSharpCode.SharpZipLib.Zip.ZipOutputStream ZOut = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(ZFS);
  78. ZOut.SetLevel(6);
  79. ZOut.Password = Password;
  80. ICSharpCode.SharpZipLib.Zip.ZipEntry ZipEntry = default(ICSharpCode.SharpZipLib.Zip.ZipEntry);
  81. byte[] Buffer = new byte[4097];
  82. int ByteLen = 0;
  83. FileStream FS = null;
  84. int ParentDirLen = InputDir.Length + 1;
  85. for (int i = 0; i <= Files.Count - 1; i++)
  86. {
  87. //Relativen Pfad für die Zip Datei erstellen
  88. RelativePath = Files[i].Substring(ParentDirLen);
  89. //ZipEntry erstellen
  90. ZipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(RelativePath);
  91. ZipEntry.DateTime = System.DateTime.Now;
  92. //Eintrag hinzufügen
  93. ZOut.PutNextEntry(ZipEntry);
  94. //Datei in den Stream schreiben
  95. FS = new FileStream(Files[i], FileMode.Open, FileAccess.Read, FileShare.Read);
  96. do
  97. {
  98. ByteLen = FS.Read(Buffer, 0, Buffer.Length);
  99. ZOut.Write(Buffer, 0, ByteLen);
  100. }
  101. while (!(ByteLen <= 0));
  102. FS.Close();
  103. }
  104. ZOut.Finish();
  105. ZOut.Close();
  106. ZFS.Close();
  107. }
  108. /// <summary>
  109. /// Diese Funktion komprimiert alle angegebenen Dateien die aus einem Ordner stammen und nicht aus unterschiedlichen Ordnern.
  110. /// Das hat den zweck falls man einen Ordner komprimieren will jedoch nicht mit allen Dateien sondern nur mit bestimmten Dateien.
  111. /// Dadurch bleibt die Ordnerstruktur erhalten wenn das Archiv erstellt wurde. Im Gegenstatz zur Funktion "CompressFiles" die keine Ordnerstrukuren erstellt
  112. /// </summary>
  113. /// <param name="InputFiles">Die Dateien die komprimiert werden sollen</param>
  114. /// <param name="FileName">Gibt den Namen an nach dem die ZIP Datei benannt werden soll</param>
  115. /// <param name="OutputDir">Gibt das Ziel für die ZIP Datei an. Wenn kein Ziel übergeben wurde wird die Datei im Parent Ordner erstellt</param>
  116. public void CompressDirectory(List<string> InputFiles, string FileName, string OutputDir)
  117. {
  118. string RelativePath = null;
  119. if (Directory.Exists(OutputDir) == false) Directory.CreateDirectory(OutputDir);
  120. FileStream ZFS = new FileStream(OutputDir + "\\" + FileName, FileMode.Create);
  121. ICSharpCode.SharpZipLib.Zip.ZipOutputStream ZOut = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(ZFS);
  122. ZOut.SetLevel(6);
  123. ICSharpCode.SharpZipLib.Zip.ZipEntry ZipEntry = default(ICSharpCode.SharpZipLib.Zip.ZipEntry);
  124. byte[] Buffer = new byte[4097];
  125. int ByteLen = 0;
  126. FileStream FS = null;
  127. int ParentDirLen = Path.GetDirectoryName(InputFiles[0]).Length;
  128. for (int i = 0; i <= InputFiles.Count - 1; i++)
  129. {
  130. //Relativen Pfad für die Zip Datei erstellen
  131. RelativePath = InputFiles[i].Substring(ParentDirLen);
  132. //ZipEntry erstellen
  133. ZipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(RelativePath);
  134. ZipEntry.DateTime = System.DateTime.Now;
  135. //Eintrag hinzufügen
  136. ZOut.PutNextEntry(ZipEntry);
  137. //Datei in den Stream schreiben
  138. FS = new FileStream(InputFiles[i], FileMode.Open, FileAccess.Read, FileShare.Read);
  139. do
  140. {
  141. ByteLen = FS.Read(Buffer, 0, Buffer.Length);
  142. ZOut.Write(Buffer, 0, ByteLen);
  143. }
  144. while (!(ByteLen <= 0));
  145. FS.Close();
  146. }
  147. ZOut.Finish();
  148. ZOut.Close();
  149. ZFS.Close();
  150. }
  151. /// <summary>
  152. /// Diese Funktion komprimiert Dateien zu einem ZIP-Archiv.
  153. /// </summary>
  154. /// <param name="InputFiles">Die Liste mit Dateien die komprimiert werden soll.</param>
  155. /// <param name="FileName">Der Dateiname der ZIP-Datei (ohne Pfad).</param>
  156. /// <param name="OutputDir">Das Ausgabeverzeichnis wo die ZIP Datei gespeichert werden soll.</param>
  157. /// <remarks></remarks>
  158. public void CompressFiles(List<string> InputFiles, string FileName, string OutputDir)
  159. {
  160. FileStream ZFS = new FileStream(OutputDir + "\\" + FileName, FileMode.Create);
  161. ICSharpCode.SharpZipLib.Zip.ZipOutputStream ZOut = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(ZFS);
  162. ZOut.SetLevel(6);
  163. ICSharpCode.SharpZipLib.Zip.ZipEntry ZipEntry = default(ICSharpCode.SharpZipLib.Zip.ZipEntry);
  164. byte[] Buffer = new byte[4097];
  165. int ByteLen = 0;
  166. FileStream FS = null;
  167. for (int i = 0; i <= InputFiles.Count - 1; i++)
  168. {
  169. //ZipEntry erstellen
  170. ZipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(Path.GetFileName(InputFiles[i]));
  171. ZipEntry.DateTime = System.DateTime.Now;
  172. //Eintrag hinzufügen
  173. ZOut.PutNextEntry(ZipEntry);
  174. //Datei in den Stream schreiben
  175. FS = new FileStream(InputFiles[i], FileMode.Open, FileAccess.Read, FileShare.Read);
  176. do
  177. {
  178. ByteLen = FS.Read(Buffer, 0, Buffer.Length);
  179. ZOut.Write(Buffer, 0, ByteLen);
  180. }
  181. while (!(ByteLen <= 0));
  182. FS.Close();
  183. }
  184. ZOut.Finish();
  185. ZOut.Close();
  186. ZFS.Close();
  187. }
  188. /// <summary>
  189. /// Diese Funktion dekomprimiert eine ZIP-Datei.
  190. /// </summary>
  191. /// <param name="FileName">Die Datei die dekomprimiert werden soll.</param>
  192. /// <param name="OutputDir">Das Verzeichnis in dem die Dateien dekomprimiert werden sollen.</param>
  193. public void DecompressFile(string FileName, string OutputDir)
  194. {
  195. FileStream ZFS = new FileStream(FileName, FileMode.Open);
  196. ICSharpCode.SharpZipLib.Zip.ZipInputStream ZIN = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(ZFS);
  197. ICSharpCode.SharpZipLib.Zip.ZipEntry ZipEntry = default(ICSharpCode.SharpZipLib.Zip.ZipEntry);
  198. byte[] Buffer = new byte[4097];
  199. int ByteLen = 0;
  200. FileStream FS = null;
  201. string InZipDirName = null;
  202. string InZipFileName = null;
  203. string TargetFileName = null;
  204. do
  205. {
  206. ZipEntry = ZIN.GetNextEntry();
  207. if (ZipEntry == null) break;
  208. InZipDirName = Path.GetDirectoryName(ZipEntry.Name) + "\\";
  209. InZipFileName = Path.GetFileName(ZipEntry.Name);
  210. if (Directory.Exists(OutputDir + "\\" + InZipDirName) == false) Directory.CreateDirectory(OutputDir + "\\" + InZipDirName);
  211. if (InZipDirName == "\\") InZipDirName = "";
  212. TargetFileName = OutputDir + "\\" + InZipDirName + InZipFileName;
  213. FS = new FileStream(TargetFileName, FileMode.Create);
  214. do
  215. {
  216. ByteLen = ZIN.Read(Buffer, 0, Buffer.Length);
  217. FS.Write(Buffer, 0, ByteLen);
  218. }
  219. while (!(ByteLen <= 0));
  220. FS.Close();
  221. }
  222. while (true);
  223. ZIN.Close();
  224. ZFS.Close();
  225. }
  226. private void GetAllFiles(string Root, ref List<string> FileArray)
  227. {
  228. try
  229. {
  230. string[] Files = System.IO.Directory.GetFiles(Root);
  231. string[] Folders = System.IO.Directory.GetDirectories(Root);
  232. for (int i = 0; i <= Files.Length - 1; i++)
  233. {
  234. FileArray.Add(Files[i].ToString());
  235. }
  236. for (int i = 0; i <= Folders.Length - 1; i++)
  237. {
  238. GetAllFiles(Folders[i], ref FileArray);
  239. }
  240. }
  241. catch (Exception Ex)
  242. {
  243. }
  244. }
  245. }
  246. }