【问题标题】:Checking if a file is used or not [duplicate]检查文件是否被使用[重复]
【发布时间】:2014-08-15 20:02:22
【问题描述】:

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

如果没有,还有什么好方法检查它?

【问题讨论】:

标签: java c#


【解决方案1】:

通常建议不要检查文件是否正在使用。 没意义。

假设你有以下代码:

if(file is not being used)
     open file

即使 if 语句的计算结果为 true ,也不能保证在您尝试打开文件时不会使用该文件。所以,只要对文件做任何你想做的事情,并处理任何可能引发的异常。

【讨论】:

    【解决方案2】:

    抛出异常的情况只是这种情况的正确和预期行为。

    原因来自于 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

    【讨论】:

      【解决方案3】:

      首先检查文件是否存在(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;
      }
      

      【讨论】:

      • 令人惊讶的是,这段代码与 pes502 的答案几乎相同。这是巧合吗?
      • 是的,我想是的,我从stackoverflow.com/questions/876473/… 那里得到了答案,但我添加了检查存在性的选项
      • 在这些情况下明确引用原始答案可能是个好主意。
      • 我发现有很多cmets说这不是一个好主意,但是我之前用过一次,它工作正常。这就是为什么我只添加了代码并让他在它和检查文件存在之间进行选择
      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 2011-04-25
      • 2012-04-09
      • 2023-04-10
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多