• C#如何对文件进行压缩和解压操作
  • 发布于 2个月前
  • 478 热度
    0 评论

前言:

最近在做一个文件管理系统,其中需要用到大量的文件压缩和解压操作。应该说C#做这种文件压缩,解压操作还是比较简单的,因为C#本身就集成了很文件操作的类。比如比较常用的ZipFile等,今天我们就介绍一下用C#如何进行文件的压缩,解压操作。

文件压缩按键出发事件

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // 堆代码 duidaima.com
                OpenFileDialog op= new OpenFileDialog();
                //弹窗选择文件
                if (op.ShowDialog() == DialogResult.OK)
                {
                    string fileName=string.Empty,
                    fileToZip = string.Empty, 
                    zipedFile = string.Empty;
 
                    fileName = op.FileName;//弹窗选择文件的文件名
                    fileToZip = fileName;//待压缩文件目录  例:C:\Users\ZhongJinYuan\Desktop\上传\(材料设备类)附表-近五年工程案例明细表.xls
                    zipedFile = ""; //压缩后的目标文件 
                    ZipClass Zc = new ZipClass();
                    Zc.ZipFile(fileToZip, zipedFile,6);
                    MessageBox.Show("压缩成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.Trim());
            }
        }
ZipFile单个文件压缩方法
/// <summary>
        /// 堆代码 duidaima.com
        /// 压缩单个文件
        /// </summary>
        /// <param name="FileToZip">被压缩的文件名称(包含文件路径)</param>
        /// <param name="ZipedFile">压缩后的文件名称(包含文件路径)</param>
        /// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
        /// <param name="BlockSize">缓存大小</param>
        public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel)
        {
            //如果文件没有找到,则报错 
            if (!System.IO.File.Exists(FileToZip))
            {
                throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!");
            }
 
            if (ZipedFile == string.Empty)
            {
                ZipedFile = Path.GetFileNameWithoutExtension(FileToZip) + ".zip";
            }
 
            if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile = ZipedFile + ".zip";
            }
 
            ////如果指定位置目录不存在,创建该目录
            //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
            //if (!Directory.Exists(zipedDir))
            //    Directory.CreateDirectory(zipedDir);
 
            //被压缩文件名称
            string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\') + 1);
             
            System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
            ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
            ZipEntry ZipEntry = new ZipEntry(filename);
            ZipStream.PutNextEntry(ZipEntry);
            ZipStream.SetLevel(CompressionLevel);
            byte[] buffer = new byte[2048];
            System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
            ZipStream.Write(buffer, 0, size);
            try
            {
                while (size < StreamToZip.Length)
                {
                    int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                    ZipStream.Write(buffer, 0, sizeRead);
                    size += sizeRead;
                }
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                ZipStream.Finish();
                ZipStream.Close();
                StreamToZip.Close();
            }
        }
文件夹压缩按键出发事件
private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    string dirName = string.Empty, dirToZip = string.Empty, zipedFile = string.Empty;
 
                    dirToZip = fbd.SelectedPath;//待压缩文件夹 
                    zipedFile = ""; //压缩后的目标文件 
                    ZipClass Zc = new ZipClass();
                    Zc.ZipDir(dirToZip, zipedFile, 6);
                    MessageBox.Show("压缩成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.Trim());
            }
        }
ZipDir单个文件夹压缩方法
/// <summary>
        /// 压缩文件夹的方法
        /// </summary>
        public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)
        {
            //压缩文件为空时默认与压缩文件夹同一级目录
            if (ZipedFile == string.Empty)
            {
                ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);
                ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip";
            }
 
            if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile = ZipedFile + ".zip";
            }
 
            using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile)))
            {
                zipoutputstream.SetLevel(CompressionLevel);
                Crc32 crc = new Crc32();
                Hashtable fileList = getAllFies(DirToZip);
                foreach (DictionaryEntry 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.ToString().Substring(DirToZip.Length + 1));
                    entry.DateTime = (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);
                }
            }
        }
 
/// <summary>
        /// 获取所有文件
        /// </summary>
        /// <returns></returns>
        private Hashtable getAllFies(string dir)
        {
            Hashtable FilesList = new Hashtable();
            DirectoryInfo fileDire = new DirectoryInfo(dir);
            if (!fileDire.Exists)
            {
                throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
            }
 
            this.getAllDirFiles(fileDire, FilesList);
            this.getAllDirsFiles(fileDire.GetDirectories(), FilesList);
            return FilesList;
        }
 
 /// <summary>
        /// 获取一个文件夹下的所有文件夹里的文件
        /// </summary>
        /// <param name="dirs"></param>
        /// <param name="filesList"></param>
        private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
        {
            foreach (DirectoryInfo dir in dirs)
            {
                foreach (FileInfo file in dir.GetFiles("*.*"))
                {
                    filesList.Add(file.FullName, file.LastWriteTime);
                }
                this.getAllDirsFiles(dir.GetDirectories(), filesList);
            }
        }
 
/// <summary>
        /// 获取一个文件夹下的文件
        /// </summary>
        /// <param name="strDirName">目录名称</param>
        /// <param name="filesList">文件列表HastTable</param>
        private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)
        {
            foreach (FileInfo file in dir.GetFiles("*.*"))
            {
                filesList.Add(file.FullName, file.LastWriteTime);
            }
        }
解压按键触发事件
private void button2_Click(object sender, EventArgs e)
       {
           try
           {
               OpenFileDialog op = new OpenFileDialog();
               if (op.ShowDialog() == DialogResult.OK)
               {
                   string fileName = string.Empty, UnZip = string.Empty, UnzipDir = string.Empty;
                   fileName = op.FileName;
                   UnZip = fileName;//待解压文件
                   UnzipDir = "";//fileName.Substring(0, fileName.LastIndexOf('\\')); //解压后的目录 
                   UnZipClass Uzc = new UnZipClass();
                   Uzc.UnZip(UnZip, UnzipDir);
                   MessageBox.Show("解压成功!");
               }
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message.Trim());
           }
       }
UnZip解压方法
/// <summary>
        /// 功能:解压zip格式的文件。
        /// </summary>
        /// <param name="zipFilePath">压缩文件路径</param>
        /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
        /// <param name="err">出错信息</param>
        /// <returns>解压是否成功</returns>
        public void UnZip(string zipFilePath, string unZipDir)
        {
            if (zipFilePath == string.Empty)
            {
                throw new Exception("压缩文件不能为空!");
            }
            if (!File.Exists(zipFilePath))
            {
                throw new System.IO.FileNotFoundException("压缩文件不存在!");
            }
            //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
            if (unZipDir == string.Empty)
                unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
            if (!unZipDir.EndsWith("\\"))
                unZipDir += "\\";
            if (!Directory.Exists(unZipDir))
                Directory.CreateDirectory(unZipDir);
 
            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("\\"))
                        directoryName += "\\";
                    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;
                                }
                            }
                        }
                    }
                }
            }
        }
零散文件集中压缩成一个文件夹内容,按键触发事件
private void button4_Click(object sender, EventArgs e)
       {
           //测试用例
           string PathandTitles = @"undefined,/Accessary/2018/03/3ab2d7b3-7c13-42ce-be20-afda96718a6f.xls|成本管理.xls,/Accessary/2018/03/b6b91639-7621-4f1a-b57a-e6e66a57a58a.xls|项目采购总计划表(新).xls";
 
           PathandTitles = PathandTitles.Replace("/", "\\");
           string[] PathandTitle = PathandTitles.Split(',');
 
           string[] Paths = new string[PathandTitle.Length - 1];
           string[] Titles = new string[PathandTitle.Length - 1];
           for (int i = 0; i < PathandTitle.Length - 1; i++)
           {
               Paths[i] = PathandTitle[i + 1].Split('|')[0];
               Titles[i] = PathandTitle[i + 1].Split('|')[1];
           }
 
           ZipClass Zc = new ZipClass();
           Zc.CopyFiles(Paths, Titles, @"D:\鸿荣源开发\鸿荣源采购\Platform.Web\IDWebSoft", @"C:\Users\ZhongJinYuan\Desktop\上传", "批量下载测试", 6);
           MessageBox.Show("批量下载成功!");
       }
CopyFiles文件集中进行压缩的方法
/// <summary>
        /// 复制文件到一个目的文件夹下面
        /// </summary>
        /// <param name="sourceFilesPath">需要复制的文件路径数组</param>
        /// <param name="sourceFilesTitle">需要复制的文件标题数组</param>
        /// <param name="strSourceFilePath">需要复制的文件物理路径</param>
        /// <param name="strGoalFilePath">文件复制至文件夹的物理路径</param>
        /// <param name="strGoalFileName">文件复制至文件夹的文件夹名称</param>
        /// <param name="CompressionLevel">压缩率</param>
        public void CopyFiles(string[] sourceFilesPath, string[] sourceFilesTitle,string strSourceFilePath, string strGoalFilePath, string strGoalFileName, int CompressionLevel)
        {
            //判断需要复制的文件是否存在
            for (int i = 0; i < sourceFilesPath.Length; i++)
            {
                //如果文件没有找到,则报错 
                if (!System.IO.File.Exists(strSourceFilePath + sourceFilesPath[i]))
                {
                    throw new System.IO.FileNotFoundException("文件:" + sourceFilesTitle[i] + "没有找到!");
                }
            }
            // 创建目的文件夹
            if (!Directory.Exists(strGoalFilePath + "\\" + strGoalFileName))
            {
                Directory.CreateDirectory(strGoalFilePath + "\\" + strGoalFileName);
            }
            else
            {
                Directory.Delete(strGoalFilePath + "\\" + strGoalFileName, true);
                Directory.CreateDirectory(strGoalFilePath + "\\" + strGoalFileName);
            }
 
            //文件复制并重命名
            for (int j = 0; j < sourceFilesPath.Length; j++)
            {
                File.Copy(strSourceFilePath + sourceFilesPath[j], strGoalFilePath + "\\" + strGoalFileName + "\\" + sourceFilesTitle[j]);
            }
 
            //调用上面的文件夹压缩
            ZipDir(strGoalFilePath + "\\" + strGoalFileName, "", CompressionLevel);
 
        }

总结:

以上就是C#进行文件的压缩解压代码,应该说还是比较完整的,如果你们也刚好有类似的压缩,解压文件的需求,可以参考一下这篇文章的实现方式。

用户评论