代码之家  ›  专栏  ›  技术社区  ›  Vadim

如何确定删除前文件正在使用中?

  •  4
  • Vadim  · 技术社区  · 16 年前

    我正在写一个Windows服务,它可能会在某个时刻删除一个文件。因为服务处理的是常规文件IO,所以在删除过程中可能会使用文件。

    目前我正在尝试删除并在发生异常时稍后做出反应。代码如下所示:

    try
    {
        File.Delete(file);
        Status = ResponseStatus.Ok;
    }
    catch (IOException e)
    {
        Status = ResponseStatus.FileInUse;
    }
    finally
    {
        return Status;
    }
    

    如何在不使用异常的情况下确定正在使用的文件?

    4 回复  |  直到 11 年前
        1
  •  13
  •   RichieHindle    16 年前

    尝试预先检测文件是否在使用中没有意义-如果有人在检测代码和删除代码之间打开文件怎么办?您仍然需要现有的代码来处理这种情况。

    您已经拥有的代码正是实现这一点的正确方法。

        2
  •  3
  •   Adam Robinson    16 年前

    如果只想测试删除是否成功而不捕获异常,只需为 DeleteFile 功能。

    [DLLImport("Kernel32.dll", SetLastError = true)]
    public static extern bool DeleteFile(string fileName);
    

    这个会回来的 true 如果删除成功并且 false 如果不是。如果需要特定的错误代码,可以调用 Marshal.GetLastWin32Error()

        3
  •  3
  •   Jason Williams    16 年前

    正如Richie所说,捕获异常可能是这里最好的方法。

    但是,如果你想删除10个文件,而你又不想让它中途失败呢?您确实需要某种方式来保护整个事务。所以它 有助于被动检查文件是否在使用中。您只需尝试打开文件进行写入(如果成功,则立即关闭),就可以确定文件是否正在使用(或只读,这也会使文件变得不可删除)。但这本身并不能保证随后的删除尝试会成功。

    其他可行的方法是: -在删除之前移动/重命名文件(将它们放在安全的地方,这样您就知道它们不会随后被另一个进程打开),这样,如果任何单个移动操作失败,您就可以“撤消”事务。 -捕获异常并在以后尝试删除文件时排队(在您自己的程序中,或者您可以在下次重新启动时将文件标记为Windows自动删除)

        4
  •  3
  •   JaredPar    16 年前

    扩展Richie的正确答案

    在使用文件系统时,如果操作成功,则永远无法可靠地执行。您所能做的就是尝试一个操作并检查它是否成功。

    文件系统是一个你无法控制的移动目标。任何数量的外部和其他用户事件都可能影响您控制范围之外的文件系统。在许多方面,它就像多线程编程一样,不可能实现同步。每当您看到如下代码时,就会出现一个微妙的错误

    if (File.SomeTypeOfCheck(somePath) {
      File.DoSomeOperation(somePath);
    }