11

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

该进程无法访问文件“”,因为它正被另一个进程使用。

我的代码如下所示:

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

我怎么解决这个问题?

4

6 回答 6

9

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

如果您还不知道是哪个程序,您可以使用HandleProcess Explorer找出答案。

于 2011-03-08T12:49:23.793 回答
4

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

于 2011-03-08T15:05:49.117 回答
0

如果该文件正在被使用,那么您在尝试删除它时就不走运了。我无法根据您的代码告诉您可能正在使用文件的进程,但请尝试查看此处此处此处,或查看与此问题相关的任何其他问题,以获取有关此问题的指导,并且一定要遵循@Cody Gray 关于使用 Process Explorer 的指导。

于 2011-03-08T12:53:25.177 回答
0

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

于 2011-03-08T13:06:44.590 回答
0

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

对你很好,对任何使用该文件的应用程序都不好。

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

于 2013-02-08T19:02:51.563 回答
-1

只需重命名此文件。这将为尝试写入该位置的人做这件事。

笔记:

1)当然文件还没有被物理删除。很高兴做MoveFileEx这里提到的技巧来完成这项工作。

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

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

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

实际使用:

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

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

于 2013-02-08T18:59:28.417 回答