Exemple #1
0
        /// <summary>
        /// 压缩一个数据集到文件
        /// </summary>
        /// <param name="dataSet"></param>
        /// <param name="destFileName"></param>
        /// <param name="cry"></param>
        /// <param name="cryKey"></param>
        /// <returns></returns>
        public I3MsgInfo CompressADataSet(DataSet dataSet, string destFileName, bool cry, string cryKey)
        {
            #region 初始化临时文件变量
            string tmpDir         = I3DirectoryUtil.GetAppTmpTmpDir();
            string tmpDataSetFile = Path.Combine(tmpDir, "DataSet.tmp");
            string tmpRarFile     = Path.Combine(tmpDir, I3DateTimeUtil.ConvertDateTimeToLongString(DateTime.Now) + ".tmp");
            if ((!I3DirectoryUtil.CreateDirctory(tmpDir).State) || (!I3FileUtil.CheckFileNotExists(tmpDataSetFile)) || (!I3FileUtil.CheckFileNotExists(tmpRarFile)))
            {
                return(new I3MsgInfo(false, ""));
            }
            #endregion

            try
            {
                #region 数据集保存到临时文件
                try
                {
                    //保存时要写入架构信息,否则字段类型有可能会更改,如Int32更改为String
                    dataSet.WriteXml(tmpDataSetFile, XmlWriteMode.WriteSchema);
                }
                catch (Exception ex)
                {
                    return(new I3MsgInfo(false, "数据集保存到临时文件失败!文件名:" + tmpDataSetFile + "错误信息:" + ex.Message));
                }
                if (!File.Exists(tmpDataSetFile))
                {
                    return(new I3MsgInfo(false, "数据集保存到临时文件失败!文件名:" + tmpDataSetFile));
                }
                #endregion

                #region 数据集临时文件压缩到临时压缩包
                I3MsgInfo msg = this.CompressASingleFile(tmpDataSetFile, tmpRarFile);
                if (!msg.State)
                {
                    return(msg);
                }
                if (!File.Exists(tmpRarFile))
                {
                    return(new I3MsgInfo(false, "数据集临时文件压缩失败!文件名:" + tmpDataSetFile));
                }
                #endregion

                #region 临时压缩包加密到目标文件
                if (cry)
                {
                    return(I3RijnDaelCry.CryFile(tmpRarFile, destFileName, cryKey));
                }
                else
                {
                    return(I3FileUtil.MoveFile(tmpRarFile, destFileName, true));
                }
                #endregion
            }
            finally
            {
                #region  除临时文件
                I3DirectoryUtil.DeleteDirctory(tmpDir);
                #endregion
            }
        }
Exemple #2
0
        /// <summary>
        /// 解压单个文件 到 指定文件
        /// 注意:单个文件的文件名,要指定在rar文件中的相对路径
        /// </summary>
        /// <param name="sourceRarFileName"></param>
        /// <param name="sourceFileName"></param>
        /// <param name="destFileName"></param>
        /// <returns></returns>
        public I3MsgInfo UnCompressASingleFile(string sourceRarFileName, string sourceFileName, string destFileName)
        {
            #region 先删除目的文件
            if (!I3FileUtil.CheckFileNotExists(destFileName))
            {
                return(new I3MsgInfo(false, ""));
            }
            #endregion

            #region 获取临时目录与临时文件名
            string tmpDir      = I3DirectoryUtil.GetAppTmpTmpDir();
            string tmpFileName = Path.Combine(tmpDir, Path.GetFileName(sourceFileName));
            #endregion

            I3MsgInfo msg = I3DirectoryUtil.CreateDirectoryByFileName(tmpFileName);
            #region 创建临时目录
            if (!msg.State)
            {
                return(msg);
            }
            #endregion

            try
            {
                #region 生成命令行参数
                string cmdLine;
                cmdLine = " E -Y ";
                if (!string.IsNullOrEmpty(passWord))
                {
                    cmdLine = cmdLine + " -p" + I3StringUtil.AppendDoubleQuotes(passWord) + " ";
                }
                cmdLine = cmdLine + I3StringUtil.AppendDoubleQuotes(sourceRarFileName) + " "
                          + I3StringUtil.AppendDoubleQuotes(sourceFileName) + " "
                          + I3StringUtil.AppendDoubleQuotes(tmpDir);
                #endregion

                //执行
                msg = RunCmdLine(cmdLine);
                if (!msg.State)
                {
                    return(msg);
                }

                //检查临时文件
                if (!File.Exists(tmpFileName))
                {
                    return(new I3MsgInfo(false, "未知错误,临时文件未生成!文件名:" + tmpFileName));
                }

                //移动
                return(I3FileUtil.MoveFile(tmpFileName, destFileName, true));
            }
            finally
            {
                I3DirectoryUtil.DeleteDirctory(tmpDir);
            }
        }
Exemple #3
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="type"></param>
        public void Init(string fileName, Type type)
        {
            this.fileName = fileName;
            I3MsgInfo msg = I3DirectoryUtil.CreateDirectoryByFileName(fileName);

            if (!msg.State)
            {
                throw msg.ExpMsg == null ? new Exception(msg.Message) : msg.ExpMsg;
            }

            this.type = type;
        }
Exemple #4
0
        public I3MsgInfo UnAllCompressToADir(string sourceRarFileName, string destDir)
        {
            I3MsgInfo msg = I3DirectoryUtil.CreateDirctory(destDir);

            if (!msg.State)
            {
                return(msg);
            }

            string cmdLine = " X -Y -C- ";

            if (!string.IsNullOrEmpty(passWord))
            {
                cmdLine = cmdLine + " -p" + I3StringUtil.AppendDoubleQuotes(passWord) + " ";
            }
            cmdLine = cmdLine + I3StringUtil.AppendDoubleQuotes(sourceRarFileName) + " " + I3StringUtil.AppendDoubleQuotes(destDir);

            return(RunCmdLine(cmdLine));
        }
        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);
        }
Exemple #6
0
        /// <summary>
        /// 构造函数,根据完整文件名生成适应于ZipEntry的文件名
        /// </summary>
        /// <param name="aFileName"></param>
        /// <param name="aBasePath"></param>
        /// <param name="isDirctory"></param>
        public I3SharpZipFileInfo(string aFullName, string aBaseDir, bool isDirctory, I3SZFileInfoMode aMode)
        {
            string aFileName;

            if (string.IsNullOrEmpty(aBaseDir))
            {
                aFileName = Path.GetFileName(aFullName);
            }
            else
            {
                aBaseDir  = I3DirectoryUtil.CheckDirctoryLastChar(aBaseDir);
                aFileName = aFullName.Replace(aBaseDir, string.Empty);
            }

            if (isDirctory)
            {
                aFileName = I3DirectoryUtil.CheckDirctoryLastChar(aFileName);
            }

            aFileName = aFileName.Replace(@"\", "/");

            if (isDirctory)
            {
                fileName = aFileName;
                fullName = aFullName;
                fileSize = 0;
                mode     = aMode;
            }
            else
            {
                using (FileStream fileStream = new FileStream(aFullName, FileMode.Open, FileAccess.Read))
                {
                    fileName = aFileName;
                    fullName = aFullName;
                    fileSize = fileStream.Length;
                    mode     = aMode;
                }
            }
        }
Exemple #7
0
        /// <summary>
        /// 压缩整个目录,包含子目录和文件
        /// </summary>
        /// <param name="aDir"></param>
        /// <param name="destFileName"></param>
        /// <returns></returns>
        public I3MsgInfo CompressADir(string aDir, string destFileName)
        {
            #region 先删除目的文件
            if (!I3FileUtil.CheckFileNotExists(destFileName))
            {
                return(new I3MsgInfo(false, ""));
            }
            #endregion

            if (!string.IsNullOrEmpty(aDir))
            {
                aDir = I3DirectoryUtil.CheckDirctoryLastChar(aDir);
                aDir = aDir + "*";
            }
            string cmdLine = " a -ep1 -r -Y ";
            if (!string.IsNullOrEmpty(passWord))
            {
                cmdLine = cmdLine + " -p" + I3StringUtil.AppendDoubleQuotes(passWord) + " ";
            }
            cmdLine = cmdLine + I3StringUtil.AppendDoubleQuotes(destFileName) + " " + I3StringUtil.AppendDoubleQuotes(aDir);

            return(RunCmdLine(cmdLine));
        }
Exemple #8
0
        /// <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);
            }
        }
Exemple #9
0
        /// <summary>
        /// 解压所有文件到指定的目录
        ///
        /// checkFileIsNormal:解压时,是否在fileInfoList中检查其状态为normal,为normal时才解压
        /// 此功能用于更换或者删除文件时,同时,为normal状态的fileinfo.fullName将被更新,指示现在被解压到了哪里
        ///
        /// </summary>
        /// <param name="aNewPath"></param>
        /// <returns></returns>
        public I3MsgInfo UnCompressAllFile(string aNewPath, bool checkFileIsNormal)
        {
            if (!fileExists)
            {
                return(I3MsgInfo.Default);
            }

            I3MsgInfo msg;

            #region 定义变量
            string         message             = "";
            ZipInputStream inputStream         = null;
            int            normalFileCount     = GetNormalFileCount();
            long           totalNormalFileSize = GetTotalNormalFileSize(); //所有需要解压的文件的字节数
            long           passFileSize        = 0;                        //已经解压掉的文件的字节数
            long           totalPosition       = 0;                        //总共解压到的字节数
            #endregion

            try
            {
                inputStream = new ZipInputStream(File.OpenRead(fileName));
                if (!string.IsNullOrEmpty(passWord))
                {
                    inputStream.Password = passWord;
                }
                ZipEntry theEntry;

                int fileindex = 0;
                while ((theEntry = inputStream.GetNextEntry()) != null)
                {
                    I3SharpZipFileInfo normalInfo = null;
                    #region 检查文件是否为normal状态
                    if (checkFileIsNormal)
                    {
                        bool isNormal = false;
                        foreach (I3SharpZipFileInfo info in fileInfoList)
                        {
                            if (info.FileName.Equals(theEntry.Name))
                            {
                                isNormal   = info.Mode == I3SZFileInfoMode.szimNormal;
                                normalInfo = info;
                                break;
                            }
                        }

                        if (!isNormal)
                        {
                            continue;
                        }
                    }
                    #endregion
                    #region 获取目的文件名,并生成目录 normalInfo不为空时,更新FullName
                    string aNewFileName = Path.Combine(aNewPath, theEntry.Name);
                    if (normalInfo != null)
                    {
                        normalInfo.FullName = aNewFileName;
                    }
                    msg = I3DirectoryUtil.CreateDirectoryByFileName(aNewFileName);
                    if (!msg.State)
                    {
                        return(msg);
                    }
                    #endregion
                    #region 发送文件个数进度信息
                    message = "正在解压文件" + theEntry.Name + "到" + aNewFileName;
                    fileindex++;
                    OnMutiFileProcessReport(normalFileCount, fileindex, message);
                    #endregion
                    #region 如果是目录则不需要解压  文件大小为0且文件名最后一个字符是/表示是目录
                    if ((theEntry.Size.Equals(0) && (I3StringUtil.SubString(theEntry.Name, theEntry.Name.Length - 1).Equals("/"))))
                    {
                        continue;
                    }
                    #endregion

                    #region 定义单个文件的变量
                    FileStream streamWriter = null;
                    #endregion
                    try
                    {
                        #region 解压
                        streamWriter = File.Create(aNewFileName);

                        byte[] data     = new byte[blockSize];
                        long   longsize = 0;
                        while (true)
                        {
                            int size = inputStream.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                                longsize += size;
                                OnSingleFileProcessReport(theEntry.Size, longsize, message);
                                totalPosition = passFileSize + longsize;
                                OnTotalBytesProcessReport(totalNormalFileSize, totalPosition, message);
                            }
                            else
                            {
                                break;
                            }
                        }
                        passFileSize += longsize;
                        #endregion
                    }
                    finally
                    {
                        #region 释放单个文件的变量
                        if (streamWriter != null)
                        {
                            streamWriter.Close();
                        }
                        #endregion
                    }
                }

                return(I3MsgInfo.Default);
            }
            #region 错误处理
            catch (Exception ex)
            {
                return(new I3MsgInfo(false, ex.Message, ex));
            }
            #endregion
            #region 释放inputStream
            finally
            {
                if (inputStream != null)
                {
                    inputStream.Close();
                }
            }
            #endregion
        }
Exemple #10
0
        /// <summary>
        /// 根据文件信息从压缩包中获取单个文件,需要指定FullName
        /// </summary>
        /// <param name="aFileInfo"></param>
        /// <returns></returns>
        public I3MsgInfo UnCompressSingleFile(I3SharpZipFileInfo aFileInfo)
        {
            #region 检查文件名与上级目录
            if (string.IsNullOrEmpty(aFileInfo.FullName))
            {
                return(new I3MsgInfo(false, "未设置目的路径!"));
            }
            I3MsgInfo msg = I3DirectoryUtil.CreateDirectoryByFileName(aFileInfo.FullName);
            if (!msg.State)
            {
                return(msg);
            }
            string message = "正在解压文件" + aFileInfo.FileName + "到" + aFileInfo.FullName;
            #endregion
            #region 检查是否是目录  文件大小为0且文件名最后一个字符是/表示是目录
            if ((aFileInfo.FileSize.Equals(0) && (I3StringUtil.SubString(aFileInfo.FileName, aFileInfo.FileName.Length - 1).Equals("/"))))
            {
                return(I3MsgInfo.Default);
            }
            #endregion

            bool           result      = false;
            ZipInputStream inputStream = null;
            try
            {
                inputStream = new ZipInputStream(File.OpenRead(fileName));
                if (!string.IsNullOrEmpty(passWord))
                {
                    inputStream.Password = passWord;
                }
                ZipEntry theEntry;

                while ((theEntry = inputStream.GetNextEntry()) != null)
                {
                    #region 判断文件名是否为要解压的文件
                    if (!theEntry.Name.Equals(aFileInfo.FileName))
                    {
                        continue;
                    }
                    #endregion

                    #region 定义单个文件的变量
                    FileStream streamWriter = null;
                    #endregion
                    try
                    {
                        #region 解压
                        streamWriter = File.Create(aFileInfo.FullName);

                        byte[] data     = new byte[blockSize];
                        long   longsize = 0;
                        while (true)
                        {
                            int size = inputStream.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                                longsize += size;
                                OnSingleFileProcessReport(aFileInfo.FileSize, longsize, message);
                            }
                            else
                            {
                                break;
                            }
                        }
                        #endregion
                    }
                    finally
                    {
                        #region 释放单个文件的变量
                        if (streamWriter != null)
                        {
                            streamWriter.Close();
                        }
                        #endregion
                    }
                    result = true;
                }
            }
            #region 错误处理
            catch (Exception ex)
            {
                return(new I3MsgInfo(false, ex.Message, ex));
            }
            #endregion
            #region 释放inputStream
            finally
            {
                if (inputStream != null)
                {
                    inputStream.Close();
                }
            }
            #endregion

            return(new I3MsgInfo(result, ""));
        }
Exemple #11
0
        /// <summary>
        /// 从一个被压缩的数据集文件中加载数据集
        /// </summary>
        /// <param name="sourceFileName"></param>
        /// <param name="dataSet"></param>
        /// <param name="unCry"></param>
        /// <param name="unCryKey"></param>
        /// <returns></returns>
        public I3MsgInfo UnCompressADataSet(string sourceFileName, DataSet dataSet, bool unCry, string unCryKey)
        {
            #region 初始化临时文件变量
            string tmpDir         = I3DirectoryUtil.GetAppTmpTmpDir();
            string tmpDataSetFile = Path.Combine(tmpDir, "DataSet.tmp");
            string tmpRarFile     = Path.Combine(tmpDir, I3DateTimeUtil.ConvertDateTimeToLongString(DateTime.Now) + ".tmp");
            if ((!I3DirectoryUtil.CreateDirctory(tmpDir).State) || (!I3FileUtil.CheckFileNotExists(tmpDataSetFile)) || (!I3FileUtil.CheckFileNotExists(tmpRarFile)))
            {
                return(new I3MsgInfo(false, ""));
            }
            #endregion

            I3MsgInfo msg;
            try
            {
                #region 解密到临时压缩文件
                if (unCry)
                {
                    msg = I3RijnDaelCry.UnCryFile(sourceFileName, tmpRarFile, unCryKey);
                    if (!msg.State)
                    {
                        return(msg);
                    }
                }
                else
                {
                    msg = I3FileUtil.MoveFile(sourceFileName, tmpRarFile, false);
                    if (!msg.State)
                    {
                        return(msg);
                    }
                }
                if (!File.Exists(tmpRarFile))
                {
                    return(new I3MsgInfo(false, "文件解密到临时压缩文件失败!文件名:" + tmpRarFile));
                }
                #endregion

                #region 解压缩到临时数据集文件
                msg = this.UnCompressASingleFile(tmpRarFile, "DataSet.tmp", tmpDataSetFile);
                if (!msg.State)
                {
                    return(msg);
                }
                if (!File.Exists(tmpDataSetFile))
                {
                    return(new I3MsgInfo(false, "临时压缩文件解压到临时数据集文件失败!文件名:" + tmpDataSetFile));
                }
                #endregion

                #region 从临时数据集文件加载
                try
                {
                    dataSet.ReadXml(tmpDataSetFile);
                    return(I3MsgInfo.Default);
                }
                catch (Exception ex)
                {
                    return(new I3MsgInfo(false, "从临时数据集文件加载数据集失败!错误信息:" + ex.Message, ex));
                }
                #endregion
            }
            finally
            {
                #region  除临时文件
                I3DirectoryUtil.DeleteDirctory(tmpDir);
                #endregion
            }
        }