如何检查任何其他进程是否正在访问某个文件并将其释放?

时间:2010-02-10 07:20:43

标签: c#

我正在尝试删除/打开/编辑我的C#.Net应用程序中的一些文件。有时我得到异常,说明文件/目录正由另一个进程访问。有没有办法检查文件/目录是否正在按进程访问并尝试从该进程中释放文件?

3 个答案:

答案 0 :(得分:6)

没有。执行此操作的唯一方法是尝试访问该文件,并处理IOException。

实际上,这是唯一安全的方式。假设有一个IsFileInUse()方法,并且你调用它,它返回“nope,没有人使用该文件”,然后你继续访问该文件。问题是,与此同时,其他一些进程可能已锁定或删除该文件。因此,无论如何,您都需要对尝试访问文件进行异常处理。 “通过获取测试”模型是唯一100%可靠的模型。

如果另一个进程正在使用某个文件,.NET不会提供确定可能的其他进程的方法。我相信这需要一些非常低级的非托管代码,尽管我可能是错的。如果可能的话,这是一个非常低级别的操作,“从该过程中释放文件”,因为这会违反其他过程的期望 - 例如它认为允许写入文件但是你已经删除了文件并使用了句柄。如果不愿意自愿放弃锁定,我相信你需要终止其他程序。

答案 1 :(得分:4)

首先,我认为有两件事可以帮到你:

  • 考虑在打开文件时使用FileAccess和FileShare标志
  • 如果仅使用函数范围需要来自文件的数据,请使用构造

    using(FileStream stream = File.Open(...)) { <file operations> }

    这将确保文件在退出'using'块后立即关闭,而不是在GC收集FileStream对象时关闭。

其次,有一种不安全的方法来获取使用该文件的进程。它基于Windows提供的调试功能。主要思想是获取所有系统句柄并迭代它们以查找文件句柄和附加信息。这是使用我不确定记录的功能完成的。如果您有兴趣使用谷歌查找更多信息,但我认为这不是一个好方法。

答案 2 :(得分:2)

                 public bool IsInUse(string path)
                 { 
                    bool IsFree = true;
                    try
                    {
                        //Just opening the file as open/create
                        using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
                        {
                        //we can check by using
                         fs.CanRead // or
                         fs.CanWrite
                        }

                    }
                    catch (IOException ex)
                    {
                        IsFree = false;
                    }
                    return IsFree;
                 } 


                     string path = "D:\\test.doc";
                     bool IsFileFree = IsInUse(path);