.Net中使用压缩和解压缩(三)

  /// <summary>
        /// 处理在解压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在文件
        /// </summary>
        /// <param name="filename">解压后文件</param>
        /// <returns>是否替换已存在的文件,是将替换,否不替换</returns>
        private bool _ProcessOverwrite(string filename)
        {
            bool isOverWrite = false;
            ZipHelpEventArgs e = new ZipHelpEventArgs(filename, isOverWrite);
            OnZipHelperProcessOverWrite(e);
            return e.IsOverWrite;
        }
        /// <summary>
        ///  处理在压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在的压缩文件
        /// </summary>
        /// <param name="e"></param>
        private void _ProcessOverwrite(ZipHelpEventArgs e)
        {
            OnZipHelperProcessOverWrite(e);
        }
        #endregion
        #region 静态方法
        /// <summary>
        /// 获取单个文件压缩后大小
        /// </summary>
        /// <param name="filename">要压缩的文件路径</param>
        /// <param name="tempDir">临时目录</param>
        /// <returns>文件大小(以字节为单位)</returns>
        public static long GetFileCompressedSize(string fileName, string tempDir)
        {
            long rv = 0;
            //以当前时间点为文件名,以防止文件冲突
            string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");

            //创建临时压缩文件
            ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
            try
            {
                FileInfo fi = new FileInfo(fileName);
                ZipEntry entry = new ZipEntry(fi.Name);
                FileStream sReader = File.OpenRead(fileName);
                byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
                sReader.Read(buff, 0, (int)sReader.Length);
                entry.Size = sReader.Length;
                sReader.Close();
                entry.DateTime = fi.LastWriteTime;
                zipOut.PutNextEntry(entry);
                zipOut.Write(buff, 0, buff.Length);
                zipOut.Finish();
                zipOut.Close();
                if (File.Exists(targetFile))
                {
                    FileInfo fi2 = new FileInfo(targetFile);
                    rv = fi2.Length;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //删除临时文件
                if (File.Exists(targetFile))
                {
                    File.Delete(targetFile);
                }
            }
            return rv;
        }
        /// <summary>
        /// 获取某文件列表压缩后大小
        /// </summary>
        /// <param name="filename">要压缩的文件路径数组</param>
        /// <param name="tempDir">临时目录</param>
        /// <returns>文件大小(以字节为单位)</returns>
        public static long GetFileCompressedSize(string[] fileList, string tempDir)
        {
            long rv = 0;
            //以当前时间点为文件名,以防止文件冲突
            string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");
            //创建临时压缩文件
            ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
            try
            {
                foreach (string fName in fileList)
                {
                    FileInfo fi = new FileInfo(fName);
                    ZipEntry entry = new ZipEntry(fi.Name);
                    FileStream sReader = File.OpenRead(fName);
                    byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
                    sReader.Read(buff, 0, (int)sReader.Length);
                    entry.Size = sReader.Length;
                    sReader.Close();
                    entry.DateTime = fi.LastWriteTime;
                    zipOut.PutNextEntry(entry);
                    zipOut.Write(buff, 0, buff.Length);
                }
                zipOut.Finish();
                zipOut.Close();
                if (File.Exists(targetFile))
                {
                    FileInfo fi2 = new FileInfo(targetFile);
                    rv = fi2.Length;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //删除临时文件
                if (File.Exists(targetFile))
                {
                    File.Delete(targetFile);
                }
            }
            return rv;
        }
        /// <summary>
        /// 获取压缩文件里的文件列表
        /// </summary>
        /// <remarks>忽略压缩文件中的目录,只返回文件。</remarks>
        /// <param name="filename">压缩文件路径</param>
        /// <param name="tempDir">临时目录</param>
        /// <returns>文件名数组</returns>       
        public static string[] GetFileList(string fileName, string tempDir)
        {
            FastZip fz = new FastZip();
            fz.RestoreDateTimeOnExtract = true;
            string[] rv;
            //在当前程序路径/Temp 下创建临时目录
            string tempdir = Path.Combine(tempDir, "tempzip");
            try
            {
                fz.ExtractZip(fileName, tempdir, "");
                rv = Directory.GetFiles(tempdir);
                //删除临时文件
                Directory.Delete(tempdir, true);
            }
            catch (Exception ex)
            {
                rv = null;
                throw ex;
            }
            return rv;
        }

        /// <summary>
        /// 抽取压缩文件里的某个文件
        /// </summary>
        /// <param name="ZipFileName">压缩文件路径</param>
        /// <param name="zipFileName">压缩文件路径</param>
        /// <param name="extraFileName">要抽取的文件名</param>
        /// <param name="targetDir">抽取文件保存目录</param>
        /// <param name="tempDir">临时目录</param>
        public static bool GetFile(string zipFileName, string extraFileName, string targetDir, string tempDir)
        {
            bool rv = false;
            FastZip fz = new FastZip();
            fz.RestoreDateTimeOnExtract = true;
            string targetFileName = "";
            string[] tempfiles;
            FileInfo fi;
            //在当前程序路径/temp 下 创建临时目录           
            string tempdir = Path.Combine(tempDir, "tempzip");
            try
            {
                fz.ExtractZip(zipFileName, tempdir, "");
                tempfiles = Directory.GetFiles(tempdir);
                foreach (string fname in tempfiles)
                {
                    fi = new FileInfo(fname);
                    if (fi.Name.Equals(extraFileName))
                    {
                        targetFileName = Path.Combine(targetDir, fi.Name);
                        File.Move(fi.FullName, targetFileName);
                        break;
                    }
                }
                //删除临时目录
                Directory.Delete(tempdir, true);
                //检查目标文件是否已经创建
                if (File.Exists(targetFileName))
                    rv = true;
                else
                    rv = false;
            }
            catch (Exception ex)
            {
                rv = false;
                throw ex;
            }
            return rv;
        }
        /// <summary>
        /// 获取当前时间点,精确到毫秒
        /// </summary>
        /// <returns>时间点字符串</returns>
        private static string _GetCurrDatetime()
        {
            DateTime dt = System.DateTime.Now;
            string rv = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Second.ToString() + dt.Millisecond.ToString();
            return rv;
        }
        #endregion
        #endregion
    }     
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值