C# 下利用ICSharpCode.SharpZipLib.dll實現檔案/檔案夾壓縮、解壓縮

來源:互聯網
上載者:User

標籤:c#   icsharpcode.sharpzip   壓縮   解壓縮   檔案   

ICSharpCode.SharpZipLib.dll

1、壓縮某個指定目錄下日誌,將日誌壓縮到CompressionDirectory檔案夾中,並清除原來未壓縮日誌。

       #region 壓縮logs目錄下日誌        public static void CompresslogDic()        {                 try            {                string logFilePath = AppDomain.CurrentDomain.BaseDirectory + "logs";                DirectoryInfo logsDic = new DirectoryInfo(logFilePath);                FileInfo[] bipLog = logsDic.GetFiles();                DateTime dt = DateTime.Now;                List<FileInfo> logsInOneDay = new List<FileInfo>();                for (int i = 0; i < bipLog.Length; i++)                {                    if (bipLog[i].Name.Substring(bipLog[i].Name.Length - 3) != "zip")                    {                        logsInOneDay.Add(bipLog[i]);                    }                }                if (logsInOneDay.Count > 0)                {                    try                    {                        if (!Directory.Exists(logsDic.FullName + "\\CompressionDirectory"))                        {                            Directory.CreateDirectory(logsDic.FullName + "\\CompressionDirectory");                        }                        string compressFileName = dt.ToString("yyyy-MM-dd");                        if (File.Exists(logsDic.FullName + "\\CompressionDirectory\\" + dt.ToString("yyyy-MM-dd") + ".zip"))                        {                            Guid guid = Guid.NewGuid();                            compressFileName = compressFileName + "-" + guid.ToString();                        }                        compressFileName += ".zip";                        Compress(logsInOneDay, logsDic.FullName + "\\CompressionDirectory\\" + compressFileName, 9, 100);                        foreach (FileInfo fileInfo in logsInOneDay)                        {                            try                            {                                fileInfo.Delete();                            }                            catch (Exception e)                            {                                //錯誤資訊記錄處理                            }                        }                    }                    catch (Exception e)                    {                        //錯誤資訊記錄處理                    }                }                     }            catch (Exception e)            {                //錯誤資訊記錄處理            }                }        #endregion
2、壓縮指定目錄子目錄下日誌,將日誌壓縮到CompressionDirectory檔案夾中,並清除原來未壓縮日誌。

        #region 壓縮logs子目錄下日誌        public static void CompresslogsDic()        {            try            {                string logFilePath = AppDomain.CurrentDomain.BaseDirectory + "logs";                               DirectoryInfo logsDic = new DirectoryInfo(logFilePath);                FileInfo[] bipLog = logsDic.GetFiles();                DateTime dt = DateTime.Now;                DirectoryInfo[] subLosgDic = logsDic.GetDirectories();                foreach (DirectoryInfo bankDic in subLosgDic)                {                    dt = DateTime.Now;                    bipLog = bankDic.GetFiles();                    List<FileInfo> logsInOneDay = new List<FileInfo>();                    for (int i = 0; i < bipLog.Length; i++)                    {                        if (bipLog[i].Name.Substring(bipLog[i].Name.Length - 3) != "zip")                        {                            logsInOneDay.Add(bipLog[i]);                        }                    }                    if (logsInOneDay.Count > 0)                    {                        try                        {                            if (!Directory.Exists(bankDic.FullName + "\\CompressionDirectory"))                            {                                Directory.CreateDirectory(bankDic.FullName + "\\CompressionDirectory");                            }                            string compressFileName = dt.ToString("yyyy-MM-dd");                            if (File.Exists(bankDic.FullName + "\\CompressionDirectory\\" + dt.ToString("yyyy-MM-dd") + ".zip"))                            {                                Guid guid = Guid.NewGuid();                                compressFileName = compressFileName + "-" + guid.ToString();                            }                            compressFileName += ".zip";                            Compress(logsInOneDay, bankDic.FullName + "\\CompressionDirectory\\" + compressFileName, 9, 100);                            foreach (FileInfo fileInfo in logsInOneDay)                            {                                try                                {                                    fileInfo.Delete();                                }                                catch (Exception e)                                {                                    //錯誤資訊記錄處理                                }                            }                        }                        catch (Exception e)                        {                            //錯誤資訊記錄處理                        }                    }                }                         }            catch (Exception e)            {                //錯誤資訊記錄處理            }        }        #endregion
3、壓縮檔

        #region 壓縮檔        /// <summary>        /// 壓縮檔        /// </summary>        /// <param name="fileNames">要打包的檔案清單</param>        /// <param name="GzipFileName">目標檔案名</param>        /// <param name="CompressionLevel">壓縮品質層級(0~9)</param>        /// <param name="SleepTimer">休眠時間(單位毫秒)</param>             public static void Compress(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, int SleepTimer)        {            ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName));            try            {                s.SetLevel(CompressionLevel);   //0 - store only to 9 - means best compression                foreach (FileInfo file in fileNames)                {                    FileStream fs = null;                    try                    {                        fs = file.Open(FileMode.Open, FileAccess.ReadWrite);                    }                    catch                    {                        continue;                    }                    // 將檔案分批讀入緩衝區                    byte[] data = new byte[2048];                    int size = 2048;                    ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));                    entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);                    s.PutNextEntry(entry);                    while (true)                    {                        size = fs.Read(data, 0, size);                        if (size <= 0) break;                        s.Write(data, 0, size);                    }                    fs.Close();                    Thread.Sleep(SleepTimer);                }            }            finally            {                s.Finish();                s.Close();            }        }        #endregion
4、解壓縮
       #region 解壓縮檔案        /// <summary>        /// 解壓縮檔案        /// </summary>        /// <param name="GzipFile">壓縮包檔案名稱</param>        /// <param name="targetPath">解壓縮目標路徑</param>               public static void Decompress(string GzipFile, string targetPath)        {            //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";            string directoryName = targetPath;            if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//產生解壓目錄            string CurrentDirectory = directoryName;            byte[] data = new byte[2048];            int size = 2048;            ZipEntry theEntry = null;            using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))            {                while ((theEntry = s.GetNextEntry()) != null)                {                    if (theEntry.IsDirectory)                    {// 該結點是目錄                        if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);                    }                    else                    {                        if (theEntry.Name != String.Empty)                        {                            //檢查多級目錄是否存在                              if (theEntry.Name.Contains("//"))                            {                                string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1);                                if (!Directory.Exists(parentDirPath))                                {                                    Directory.CreateDirectory(CurrentDirectory + parentDirPath);                                }                            }                              //解壓檔案到指定的目錄                            using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))                            {                                while (true)                                {                                    size = s.Read(data, 0, data.Length);                                    if (size <= 0) break;                                    streamWriter.Write(data, 0, size);                                }                                streamWriter.Close();                            }                        }                    }                }                s.Close();            }        }        #endregion
5、壓縮檔夾

        #region 壓縮檔夾        /// <summary>            /// 壓縮檔夾            /// </summary>            /// <param name="dirPath">要打包的檔案夾</param>            /// <param name="GzipFileName">目標檔案名</param>            /// <param name="CompressionLevel">壓縮品質層級(0~9)</param>            /// <param name="deleteDir">是否刪除原檔案夾</param>          public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir)        {            //壓縮檔為空白時預設與壓縮檔夾同一級目錄                if (GzipFileName == string.Empty)            {                GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1);                GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip";            }            //if (Path.GetExtension(GzipFileName) != ".zip")              //{              //    GzipFileName = GzipFileName + ".zip";              //}              using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))            {                zipoutputstream.SetLevel(CompressionLevel);                ICSharpCode.SharpZipLib.Checksums.Crc32 crc = new ICSharpCode.SharpZipLib.Checksums.Crc32();                Dictionary<string, DateTime> fileList = GetAllFies(dirPath);                foreach (KeyValuePair<string, DateTime> item in fileList)                {                    FileStream fs = File.OpenRead(item.Key.ToString());                    byte[] buffer = new byte[fs.Length];                    fs.Read(buffer, 0, buffer.Length);                    ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));                    entry.DateTime = item.Value;                    entry.Size = fs.Length;                    fs.Close();                    crc.Reset();                    crc.Update(buffer);                    entry.Crc = crc.Value;                    zipoutputstream.PutNextEntry(entry);                    zipoutputstream.Write(buffer, 0, buffer.Length);                }            }            if (deleteDir)            {                Directory.Delete(dirPath, true);            }        }        #endregion
6、擷取所有檔案

        #region 擷取所有檔案        /// <summary>            /// 擷取所有檔案            /// </summary>            /// <returns></returns>            private static Dictionary<string, DateTime> GetAllFies(string dir)        {            Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>();            DirectoryInfo fileDire = new DirectoryInfo(dir);            if (!fileDire.Exists)            {                throw new System.IO.FileNotFoundException("目錄:" + fileDire.FullName + "沒有找到!");            }            GetAllDirFiles(fileDire, FilesList);            GetAllDirsFiles(fileDire.GetDirectories(), FilesList);            return FilesList;        }        #endregion
7、擷取一個檔案夾下的所有檔案夾裡的檔案

        #region 擷取一個檔案夾下的所有檔案夾裡的檔案        /// <summary>            /// 擷取一個檔案夾下的所有檔案夾裡的檔案            /// </summary>            /// <param name="dirs"></param>            /// <param name="filesList"></param>            private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList)          {              foreach (DirectoryInfo dir in dirs)              {                  foreach (FileInfo file in dir.GetFiles("*.*"))                  {                      filesList.Add(file.FullName, file.LastWriteTime);                  }                  GetAllDirsFiles(dir.GetDirectories(), filesList);              }          }          #endregion
8、擷取一個檔案夾下的檔案

        #region 擷取一個檔案夾下的檔案        /// <summary>            /// 擷取一個檔案夾下的檔案            /// </summary>            /// <param name="dir">目錄名稱</param>            /// <param name="filesList">檔案清單HastTable</param>            private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList)          {              foreach (FileInfo file in dir.GetFiles("*.*"))              {                  filesList.Add(file.FullName, file.LastWriteTime);              }          }          #endregion  










C# 下利用ICSharpCode.SharpZipLib.dll實現檔案/檔案夾壓縮、解壓縮

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.