- /// <summary>
- /// Zip 壓縮文件
- /// </summary>
- public class Zip
- {
- public Zip()
- {
-
- }
- #region 加壓方法
- /// <summary>
- /// 功能:壓縮文件(暫時只壓縮文件夾下一級目錄中的文件,文件夾及其子級被忽略)
- /// </summary>
- /// <param name="dirPath">被壓縮的文件夾夾路徑</param>
- /// <param name="zipFilePath">生成壓縮文件的路徑,為空則默認與被壓縮文件夾同一級目錄,名稱為:文件夾名+.zip</param>
- /// <param name="err">出錯信息</param>
- /// <returns>是否壓縮成功</returns>
- public static bool ZipFile(string dirPath, string zipFilePath, out string err)
- {
- err = "";
- if (dirPath == string.Empty)
- {
- err = "要壓縮的文件夾不能為空!";
- return false;
- }
- if (!Directory.Exists(dirPath))
- {
- err = "要壓縮的文件夾不存在!";
- return false;
- }
- //壓縮文件名為空時使用文件夾名+.zip
- if (zipFilePath == string.Empty)
- {
- if (dirPath.EndsWith("http://"))
- {
- dirPath = dirPath.Substring(0, dirPath.Length - 1);
- }
- zipFilePath = dirPath + ".zip";
- }
-
- try
- {
- string[] filenames = Directory.GetFiles(dirPath);
- using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
- {
- s.SetLevel(9);
- byte[] buffer = new byte[4096];
- foreach (string file in filenames)
- {
- ZipEntry entry = new ZipEntry(Path.GetFileName(file));
- entry.DateTime = DateTime.Now;
- s.PutNextEntry(entry);
- using (FileStream fs = File.OpenRead(file))
- {
- int sourceBytes;
- do
- {
- sourceBytes = fs.Read(buffer, 0, buffer.Length);
- s.Write(buffer, 0, sourceBytes);
- } while (sourceBytes > 0);
- }
- }
- s.Finish();
- s.Close();
- }
- }
- catch (Exception ex)
- {
- err = ex.Message;
- return false;
- }
- return true;
- }
- #endregion
-
- #region 解壓
- /// <summary>
- /// 功能:解壓zip格式的文件。
- /// </summary>
- /// <param name="zipFilePath">壓縮文件路徑</param>
- /// <param name="unZipDir">解壓文件存放路徑,為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾</param>
- /// <param name="err">出錯信息</param>
- /// <returns>解壓是否成功</returns>
- public static bool UnZipFile(string zipFilePath, string unZipDir, out string err)
- {
- err = "";
- if (zipFilePath == string.Empty)
- {
- err = "壓縮文件不能為空!";
- return false;
- }
- if (!File.Exists(zipFilePath))
- {
- err = "壓縮文件不存在!";
- return false;
- }
- //解壓文件夾為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾
- if (unZipDir == string.Empty)
- unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
- if (!unZipDir.EndsWith("http://"))
- unZipDir += "http://";
- if (!Directory.Exists(unZipDir))
- Directory.CreateDirectory(unZipDir);
-
- try
- {
- using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
- {
-
- ZipEntry theEntry;
- while ((theEntry = s.GetNextEntry()) != null)
- {
- string directoryName = Path.GetDirectoryName(theEntry.Name);
- string fileName = Path.GetFileName(theEntry.Name);
- if (directoryName.Length > 0)
- {
- Directory.CreateDirectory(unZipDir + directoryName);
- }
- if (!directoryName.EndsWith("http://"))
- directoryName += "http://";
- if (fileName != String.Empty)
- {
- using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
- {
-
- int size = 2048;
- byte[] data = new byte[2048];
- while (true)
- {
- size = s.Read(data, 0, data.Length);
- if (size > 0)
- {
- streamWriter.Write(data, 0, size);
- }
- else
- {
- break;
- }
- }
- }
- }
- }//while
- }
- }
- catch (Exception ex)
- {
- err = ex.Message;
- return false;
- }
- return true;
- }//解壓結束
- #endregion
|