我正在尝试删除我的应用程序的某个其他进程使用的一个文件。 所以它给出了一个错误,该文件被某个另一个进程使用。
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
DirectoryInfo NewDir = new DirectoryInfo(imagefolderpath1);
FileInfo[] files = NewDir.GetFiles("*.jpg");
foreach (var item in files)
{
string strFile = imagefolderpath1 + "\\" + item.ToString();
if (File.Exists(strFile))
{
File.Delete(strFile);
}
}
}
我该如何解决这个问题,请你帮帮我????
答案 0 :(得分:3)
您需要通过以下代码终止导致此问题的进程,例如:
string fileName = @"D:\pathname.jpg";//Path to locked file
Process Handletool = new Process();
Handletool.StartInfo.FileName = "handle.exe";
Handletool.StartInfo.Arguments = fileName+" /accepteula";
Handletool.StartInfo.UseShellExecute = false;
Handletool.StartInfo.RedirectStandardOutput = true;
Handletool.Start();
Handletool.WaitForExit();
string outputTool = Handletool.StandardOutput.ReadToEnd();
string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)";
foreach(Match match in Regex.Matches(outputTool, matchPattern))
{
Process.GetProcessById(int.Parse(match.Value)).Kill();
}
你可以从http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx
获取Handle.exe答案 1 :(得分:0)
该文件需要在被删除之前由其他程序释放。如果您不知道,可以使用Process Explorer找出锁定它的内容。
答案 2 :(得分:0)
您无法访问其他进程使用的文件。但是,如果您的应用程序稍后执行此操作并不重要,则可以在System.AppDomain.ProcessExit事件处理程序中执行此操作。 只需将文件添加到集中管理列表并注册清理例程,如下所示:
AppDomain.CurrentDomain.ProcessExit += new EventHandler(deleteFilesIfPossibleNow);
在处理程序中,如果仍然从其他进程访问文件,则仍必须处理异常。
答案 3 :(得分:0)
而不是使用_FormClosed,您可能想尝试从其他代码启动表单,如下所示:
DirectoryInfo NewDir;
FileInfo[] files;
using (var form = new Form1())
{
var result = form.ShowDialog();
if (result == DialogResult.Close)
{
NewDir = new DirectoryInfo(imagefolderpath1);
files = NewDir.GetFiles("*.jpg");
}
}
foreach(var item in files) {
string strFile = imagefolderpath1 + "\\" + item.toString();
File.Delete(strFile);
}
我不是百分之百地确定你的程序是如何工作的,但你可以在它们关闭之前从表单中获取信息,然后使用这种方法关闭它们之后使用的文件