我正在使用网络安装程序,而且我目前正在做的事情之一是
void MoveFiles()
{
lbldlstatus.Text = "Moving Files";
string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master";
DirectoryInfo d = new DirectoryInfo(InstallDirectory);
foreach(var file in d.GetFiles("*"))
{
try
{
if (File.Exists(file.Name)) {
File.Delete(file.Name);
}
Directory.Move(file.FullName, file.Name);
Cleanup();
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
}
void Cleanup()
{
lbldlstatus.Text = "Cleaning Up Files";
try
{
if (File.Exists("Repack.zip"))
{
File.Delete("Repack.zip");
}
if(Directory.Exists("DoxramosRepack-master"))
{
Directory.Delete("DoxramosRepack-master");
}
lbldlstatus.Text = "Repack Installed Successfully";
}
当我到达Cleanup()
时,我有System.IO.IOException
。
进程无法访问文件Repack.zip,因为它正被使用 另一个过程。
完整的代码运行
下载 - >提取物 - > MOVE->清理。
我不确定正在使用哪个进程,但我希望找到一种方法让每个进程在开始之前等待上一个进程完成。
答案 0 :(得分:1)
根据下面的提取代码
$.oc.[...]
在完成zip文件之前,您正在调用移动文件。看到移动文件方法负责调用清理功能,那么在尝试删除zip文件之前,应该确保已经丢弃了zip文件。
void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
MoveFiles();
}
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
一切都被移动后也应该调用清理。目前,示例代码在for循环中重复调用它。
答案 1 :(得分:1)
您粘贴在pastebin上的代码与您在此处发布的代码不同。 pastebin中的代码从不调用清理。
无论如何,问题是因为您在void Extract()
{
string zipPath = @"Repack.zip";
string extractPath = @".";
try
{
using (ZipFile unzip = ZipFile.Read(zipPath))
{
unzip.ExtractAll(extractPath);
lbldlstatus.Text = "Extracting Files";
}
MoveFiles();
}
catch (ZipException e)
{
MessageBox.Show(e.ToString());
lbldlstatus.Text = "Repack Installation Failed";
}
}
区域内呼叫MoveFiles()
:
using
将其移到使用区域之外。