[window form]產生檔案後壓縮產生空檔問題

[window form]產生檔案後壓縮產生空檔問題

今天遇到問題如下,紀錄一下治標的方式。

問題描述

產生zip檔案時,因為產生原始檔案(要加入壓縮檔的檔案)的process先把檔案鎖定,導致第一次產生zip檔案時會發生

只建立目錄,但是檔案並不加入的狀況。

解決方式

原始檔案在產生當下,同時壓縮到自訂temp資料夾路徑的zip檔(這個檔會是空檔),接下來再跑壓縮zip檔案的程式。

擷取部份code如下:

產生檔案


/// <summary>
        /// 產生空檔.
        /// </summary>
        private void GenFakeFile()
        {
            Computer MyCom = new Computer();
            //來源路徑            
            string SourceDir = txt_Source.Text.Trim();
            //目的路徑
            string[] sep = new string[] { "\\" };


            defaultfoldername = "上版資料_" + txt_EmpId.Text.Trim() + "_" + DateTime.Now.ToString("yyyyMMdd");
            string[] sourcepath = SourceDir.Split(sep, StringSplitOptions.None);
            string TargetDir = txt_Dest.Text.Trim() + ((sourcepath.Length > 0) ? "\\" + defaultfoldername : string.Empty);
            //壓縮檔名
            string zipFileName = (sourcepath.Length > 0) ? txt_Dest.Text.Trim() + "\\" + defaultfoldername + ".zip" : string.Empty;
            if (SourceDir.Length == 0)
            {
                MessageBox.Show("請選擇來源文字檔!");
                GetSourcePath();
                return;
            }
            else if (TargetDir.Length == 0)
            {
                MessageBox.Show("請選擇上版資料夾!");
                GetDestPath();
                return;
            }
            try
            {
                FileInfo dirSource = new FileInfo(SourceDir);
            }
            catch (ArgumentException argSource)
            {
                MessageBox.Show(string.Format("來源資料夾路徑格式有誤\r\n{0}!\r\n請重新選擇!", argSource.ToString()));
                GetSourcePath();
                return;
            }
            try
            {
                DirectoryInfo di = new DirectoryInfo(TargetDir);
                //目的路徑沒有就建資料夾
                if (!di.Exists)
                    MyCom.FileSystem.CreateDirectory(TargetDir);
            }
            catch (ArgumentException argDest)
            {
                MessageBox.Show(string.Format("目的資料夾路徑格式有誤!\r\n{0}\r\n請重新選擇!", argDest.ToString()));
                GetDestPath();
                return;
            }
            try
            {
                //先將產生的檔案壓縮到temp資料夾自建的檔案(會是空檔)
                //確保空檔的檔案控制權不會被鎖定
                string tempfileDir = Environment.GetEnvironmentVariable("Temp") + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss");
                if (Directory.Exists(tempfileDir) == false)
                {
                    Directory.CreateDirectory(tempfileDir);
                }
                string tempfile = tempfileDir + "\\" + defaultfoldername + ".zip";
                Utility.FileIOUtil fileUtil = new Utility.FileIOUtil();
                Utility.ZipUtil zipUtil = new Utility.ZipUtil();
                foreach (string fileitem in fileUtil.ImportData(SourceDir))
                {
                    string destfilename = TargetDir + fileitem;
                    fileUtil.CreateFakeFile(destfilename);
                    //將產生的檔案壓縮到temp資料夾自建的檔案
                    zipUtil.Zip(destfilename, tempfile);
                }
                MessageBox.Show("空檔產生完畢");
            }
            catch (Exception ek)
            {
                MessageBox.Show(ek.ToString());
            }
        }

壓縮檔案


/// <summary>
        /// 壓縮ZIP檔案.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        private void btn_Package_Click(object sender, EventArgs e)
        {
            //作假檔
            GenFakeFile();
            //來源路徑            
            string SourceDir = txt_Source.Text.Trim();
            //目的路徑
            string[] sep = new string[] { "\\" };
            string[] sourcepath = SourceDir.Split(sep, StringSplitOptions.None);
            defaultfoldername = "上版資料_" + txt_EmpId.Text.Trim() + "_" + DateTime.Now.ToString("yyyyMMdd");
            string TargetDir = txt_Dest.Text.Trim() + ((sourcepath.Length > 0) ? "\\" + defaultfoldername : string.Empty);

            DirectoryInfo di = new DirectoryInfo(TargetDir);
            Utility.ZipUtil zipUtil = new Utility.ZipUtil();

            saveFileDialog1.FileName = defaultfoldername + ".zip";

            if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                foreach (string diritem in GetSubFolder(di.FullName))
                {
                    zipUtil.Zip(diritem, saveFileDialog1.FileName);
                }
                MessageBox.Show("打包成功!壓縮檔路徑: [ " + saveFileDialog1.FileName + " ] !");
            }


        }