如何删除其他进程正在使用的文件?

时间:2011-03-08 12:46:21

标签: c# .net file file-io file-locking

当我尝试删除文件时会发生以下异常:

  

进程无法访问文件''   因为它被另一个人使用   过程

我的代码如下:

string[] files = Directory.GetFiles(@"C:\SEDocumentConverter\SOURCE");
foreach (string file in files)
{               
   File.Delete(file);
}

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:7)

无法删除其他进程当前正在使用的文件。您必须先关闭该文件首先打开的任何程序,然后才能将其删除。

如果您还不知道是哪个节目,可以使用HandleProcess Explorer来解决。

答案 1 :(得分:4)

您可以P / Invoke Windows MoveFileEx函数,并使用带有NULL目标名称的MOVEFILE_DELAY_UNTIL_REBOOT标志。这将在您重新启动时删除该文件。

答案 2 :(得分:0)

如果正在使用该文件,那么您在尝试删除该文件时运气不佳。我无法根据您的代码告诉您哪些进程可能正在使用该文件,但请尝试查看hereherehere,或者查看任何其他问题出现与此问题相关的有关此问题的指导,并且一定要遵循@Cody Gray关于使用Process Explorer的指导。

答案 3 :(得分:0)

稍微偏离主题:但是从您的代码中可以看出,您试图删除文件夹中的所有文件。 好吧,不是一个一个地删除它们,我们有另一个方法Directory.Delete(path,True),它将删除名为path的字符串中包含的目录。然后,您可以根据需要重新创建目录。但是你的问题也可能存在。

答案 4 :(得分:0)

另一种方法是找到文件的所有打开句柄并强行关闭它们。

适合您,对使用该文件的任何应用都不好。

可以在UI中使用SysInternals ProcessExplorer进行尝试。

答案 5 :(得分:-2)

只需重命名此文件。无论谁试图写到那个位置,这都可以做到。

注意:

1)当然,文件尚未在物理上删除。很高兴在这里提到的MoveFileEx技巧来完成这项工作。

2)如果要删除锁定的文件以在其位置编写新的smth(例如在构建期间),只需将文件重命名为GUID名称即可。如果您需要清理文件夹,请使用忽略的扩展/隐藏属性,或将文件重命名为%TEMP%下的路径(如果在同一驱动器上)。

3)并非所有锁定的文件都可以重命名,但它适用于90%的实际应用程序。您可以在不影响打开的读/写/执行句柄的情况下移动文件,它将继续使用移动的文件(当然,如果在相同的NTFS卷内移动)。

4)这就是Windows Installer在它要求你重新启动之前基本上会做的事情:将文件从你的眼睛移开,安排在重新启动时删除。通常,新安装的应用程序可以立即使用。

实际使用:

我最喜欢的是MSBuild。使用这些东西覆盖<Copy/>任务使得所有构建都以linux方式进行。您不关心某个prev版本是否仍在某个地方运行,仍然可以构建和运行。旧应用程序继续使用旧版本的文件。新应用程序加载新编写的版本。

如果在同一个驱动器上(可能不是我的情况),可能会移动到%TEMP%。我只是将它们重命名为当前源控制客户端忽略的扩展名。