检查是否使用了文件

时间:2014-06-25 09:58:39

标签: java c#

在Java和C#中,是否有任何函数可以检查文件是否被使用,比如我们在尝试删除已使用的文件时收到的错误消息?

如果没有,检查它的另一个好方法是什么?

3 个答案:

答案 0 :(得分:1)

通常建议检查文件是否正在使用。 这毫无意义。

假设您有以下代码:

if(file is not being used)
     open file

即使if语句的计算结果为true,也无法保证在您尝试打开文件时不会使用该文件。因此,只需对文件执行任何操作,并处理可能引发的任何异常。

答案 1 :(得分:0)

抛出异常的情况只是适当的情况和此类情况的预期行为。

其原因来自OO原则。您请求对象执行某些操作。如果无法按预期完成它,它应该返回它。我的语言就像C ++,其中异常软件不那么受欢迎,将返回开发人员应该检查的错误代码。这很容易出错,因此对于以后的语言,API设计者已经引入了异常。这使开发人员能够正确控制代码。

访问资源是一项复杂的任务,必须考虑很多情况,并且它始终是一个多线程案例。

而不是接近无法删除文件并检测到该问题的问题。您应该关注在发生这种情况时应该应用的逻辑。

Java解决方案:

您可以使用Files和方法delete(java.nio.file.Path)

当不允许删除文件时,此方法抛出SecurityException

或者您可以使用系统SecurityManager

SecurityManager security = System.getSecurityManager();
 securty.checkDelete(String file)
  

如果不允许调用线程删除指定文件,则抛出SecurityException。

C#的解决方案:

同样的规则适用于C#,System.IO.File.Delete它会抛出一个UnauthorizedAccessException

答案 2 :(得分:-1)

首先检查文件是否存在(File.Exists)如果是,请尝试在trycatch块内打开以进行写入,如果生成异常,则由另一个进程使用。然而,通过例外找到一些东西并不是最好的方法!

你可以试试这个:

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}