[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 + " ] !");
}
}