protected string getTmpFileName() { string tmpDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tmp"); //MessageBox.Show(tmpDir); if (!I3DirectoryUtil.CreateDirctory(tmpDir).State) { throw new Exception("临时目录创建失败"); } try { I3DirectoryUtil.CheckAndClearDirctory(tmpDir); } catch { } string tmpFileName = Path.Combine(tmpDir, Guid.NewGuid().ToString() + ".xls"); return(tmpFileName); }
/// <summary> /// 根据fileInfoList的设置,生成新的压缩包文件 /// /// 错误处理:IEFS_Error.LastErrorMessage /// /// </summary> /// <returns></returns> public I3MsgInfo Flush() { #region 定义变量 string message; ZipOutputStream outputStream = null; int addFileCount = GetAddFileCount() + GetNormalFileCount(); long totalAddFileSize = GetTotalAddFileSize() + GetTotalNormalFileSize(); //所有需要压缩的文件的字节数 long passFileSize = 0; //已经压缩的文件的字节数 long totalPosition = 0; //总共压缩到的字节数 #endregion #region 检查临时文件与临时目录 string tmpFile = fileName + ".tmpsharpzip"; if (!I3FileUtil.CheckFileNotExists(tmpFile)) { return(new I3MsgInfo(false, "")); } string tmpDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, I3DateTimeUtil.ConvertDateTimeToLongString(DateTime.Now)); I3MsgInfo msg = I3DirectoryUtil.CheckAndClearDirctory(tmpDir); if (!msg.State) { return(msg); } #endregion try { #region 解压所有不需要替换或者删除的文件到临时目录 msg = UnCompressAllFile(tmpDir, true); if (!msg.State) { return(msg); } #endregion #region 开始压缩状态为normal、New、Change三种状态的文件到临时文件中 try { #region 压缩 outputStream = new ZipOutputStream(File.Create(tmpFile)); outputStream.SetLevel(zipLevel); if (!string.IsNullOrEmpty(passWord)) { outputStream.Password = passWord; } int fileindex = 0; foreach (I3SharpZipFileInfo info in fileInfoList) { #region 判断文件是否要参与压缩 if (info.Mode == I3SZFileInfoMode.szimDelete) { continue; } #endregion #region 发送文件个数进度信息 message = "正在压缩文件\"" + info.FileName + "\""; fileindex++; OnMutiFileProcessReport(addFileCount, fileindex, message); #endregion #region 写入ZipEntry //outputStream.PutNextEntry(GetEntry(info.FileName, info.FullName)); //自己在ZipEntry中写入CRC信息,读取时会报Eof of Header的错误 //在网上查找资料后发现,新版SharpZip.dll已经更改,不再需要自己写入CRC等信息 outputStream.PutNextEntry(new ZipEntry(info.FileName)); info.Mode = I3SZFileInfoMode.szimNormal; if (info.FileSize == 0) { continue; } #endregion FileStream sourceFileStream = null; try { #region 将文件写入压缩流 sourceFileStream = File.OpenRead(info.FullName); sourceFileStream.Position = 0; //IEFS_Stream.WriteStreamToStream(null, sourceFileStream, outputStream, blockSize, null); byte[] data = new byte[blockSize]; long longsize = 0; while (true) { int size = sourceFileStream.Read(data, 0, data.Length); if (size > 0) { outputStream.Write(data, 0, size); longsize += size; OnSingleFileProcessReport(info.FileSize, longsize, message); totalPosition = passFileSize + longsize; OnTotalBytesProcessReport(totalAddFileSize, totalPosition, message); } else { break; } } passFileSize += longsize; #endregion } finally { #region 释放单个文件的文件流 if (sourceFileStream != null) { sourceFileStream.Close(); } #endregion } } #endregion } #region 错误处理 catch (Exception ex) { return(new I3MsgInfo(false, ex.Message, ex)); } #endregion #region 释放变量 删除临时目录 finally { if (outputStream != null) { outputStream.Finish(); outputStream.Close(); } I3DirectoryUtil.DeleteDirctory(tmpDir); } #endregion #endregion #region 替换原始文件 if (!I3FileUtil.CheckFileNotExists(fileName)) { return(new I3MsgInfo(false, "")); } return(I3FileUtil.MoveFile(tmpFile, fileName, true)); #endregion } finally { I3DirectoryUtil.DeleteDirctory(tmpDir); I3FileUtil.CheckFileNotExists(tmpFile); } }