C# Can';t删除文件夹,因为它是';它正在使用中。
我有一个问题与自动更新软件,我试图使。该应用程序作为服务器应用程序运行,并通过FTP检查更新,如果有更新版本可用,则下载更新。然后在程序根目录中解压名为update的文件夹。然后它启动一个名为update.bat的文件,该文件执行我可能需要为该更新执行的任何文件复制等操作。完成后,update.bat将启动新的服务器应用程序。一旦程序再次检查更新,它将删除服务器应用程序根目录中的更新目录以及从更新服务器下载的update.rar文件。所有这些都可以完美地工作,但文件夹正在使用中且不会删除。我读过关于释放句柄和更改当前目录等的各种内容。。但似乎无法让它发挥作用。如果有人能在这里帮助我,我将不胜感激。以下是此更新的代码C# Can';t删除文件夹,因为它是';它正在使用中。,c#,io,directory,C#,Io,Directory,我有一个问题与自动更新软件,我试图使。该应用程序作为服务器应用程序运行,并通过FTP检查更新,如果有更新版本可用,则下载更新。然后在程序根目录中解压名为update的文件夹。然后它启动一个名为update.bat的文件,该文件执行我可能需要为该更新执行的任何文件复制等操作。完成后,update.bat将启动新的服务器应用程序。一旦程序再次检查更新,它将删除服务器应用程序根目录中的更新目录以及从更新服务器下载的update.rar文件。所有这些都可以完美地工作,但文件夹正在使用中且不会删除。我读过
private void Form1_Load(object sender, EventArgs e)
{
foreach (string s in Directory.GetDirectories("C:/my update dir"))
{
if (s.Contains("Instance"))
{
var _instance = Regex.Match(s, @"\d+");
Process p = new Process();
ProcessStartInfo pinfo = new ProcessStartInfo();
pinfo.FileName = "cmd.exe";
pinfo.WorkingDirectory = "C:/mySQL/bin";
pinfo.Arguments = "/C mysql.exe -u** -p** dbnameHere" + _instance.ToString() +
" < \"C:/my update dir/update/update.sql\"";
p.StartInfo = pinfo;
p.Start();
p.WaitForExit();
p.Close();
p.Dispose();
Directory.SetCurrentDirectory("C:/");
}
}
Directory.SetCurrentDirectory("C:/");
this.Dispose();
Application.Exit();
}
private void Form1\u加载(对象发送方,事件参数e)
{
foreach(Directory.GetDirectories(“C:/my update dir”)中的字符串s)
{
如果(s.包含(“实例”))
{
var_instance=Regex.Match(s,@“\d+”);
过程p=新过程();
ProcessStartInfo pinfo=新的ProcessStartInfo();
pinfo.FileName=“cmd.exe”;
pinfo.WorkingDirectory=“C:/mySQL/bin”;
pinfo.Arguments=“/C mysql.exe-u**-p**dbnameHere”+\u instance.ToString()+
“<\”C:/my update dir/update/update.sql\”;
p、 StartInfo=pinfo;
p、 Start();
p、 WaitForExit();
p、 Close();
p、 处置();
SetCurrentDirectory(“C:/”);
}
}
SetCurrentDirectory(“C:/”);
这个。Dispose();
Application.Exit();
}
我猜你的问题在这里:
完成后,update.bat将启动新服务器
应用程序
Windows将“锁定”目录直至.BAT文件。因此,如果.BAT从该目录运行服务器进程,则该进程将继承调用进程的CWD和文件描述符
从您的代码中不清楚发生了什么,但您可能还想在生成流程之前尝试更改CWD。是的,这非常有效。只需要更改.bat文件中的目录,它就释放了句柄。