【问题标题】:How can I delete a file that is in use by another process?如何删除另一个进程正在使用的文件?
【发布时间】:2011-03-08 12:46:20
【问题描述】:

当我尝试删除文件时出现以下异常:

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

我的代码如下:

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

我该如何解决这个问题?

【问题讨论】:

  • 找出其他进程正在访问该文件,并阻止它这样做。
  • 您是否在编辑器中打开了其中一个文件?您是否在程序的早期使用过其中一个文件,并且可能会打开一个流?
  • 是您输入的错误 - 即返回空文件名还是您刚刚删除了问题的名称?
  • 你可以按照这个解决方案stackoverflow.com/questions/13262548/…

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


【解决方案1】:

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

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

【讨论】:

  • 使用 Process Explorer,您还可以在不关闭程序的情况下移除句柄(如果您确定程序可以在没有句柄的情况下愉快地生活)。
【解决方案2】:

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

【讨论】:

  • 请注意,如文档所示,此标志只能在进程在管理员用户的上下文中运行时使用。这对于标准文档文件来说可能是矫枉过正。首先,您不应该从 .NET 应用程序中移动分页文件。
【解决方案3】:

如果文件正在被使用,那么您在尝试删除它时会很不走运。我无法根据您的代码告诉您什么进程可能正在使用文件,但请尝试查看 hereherehere,或查看与此相关的任何其他问题有关此问题的指导,请务必遵循 @Cody Gray 关于使用 Process Explorer 的指导。

【讨论】:

  • 哇,这太不可思议了。至少还有 3 个其他问题的标题完全匹配此问题的原始标题。
  • 是的,谁知道呢?作为@Suresh 的注释 - 您应该看到 Stack Overflow 认为的问题列表,就像您在为您的问题输入主题行时所问的问题一样。如果您先查看这些内容,您可能会找到答案并省去发帖的麻烦。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

      只需重命名此文件。这将对尝试写入该位置的人执行此操作。

      注意事项:

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

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

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

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

      实际使用:

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 2019-06-26
        • 2013-05-27
        • 2012-10-01
        相关资源
        最近更新 更多