【问题标题】:Check if directory can be opened and list its files检查目录是否可以打开并列出其文件
【发布时间】:2013-03-05 11:55:41
【问题描述】:

我正在用 Java 开发一个 shell。这个shell可以执行命令find 'regex'。此命令递归查找名称与regex 匹配的所有文件。查找文件的方法是:

 public void findFile(String regExp, String dirName) {
    File dir = new File(dirName);

    if (dir.canRead() == false)
        return;

    File[] files = dir.listFiles();

    for (File file : files) {
        if (file.isFile() == true)
            if (file.getName().matches(regExp) == true)
                System.out.println(file.getAbsolutePath());
        if (file.isDirectory() == true && file.canRead() == true) {
            findFile(regExp, file.getAbsolutePath());
        }
    }
}

但如果无法打开目录,此命令将失败。例如,在D:分区中,我有一个名为found.00的隐藏目录(这个目录可能属于系统),我无法打开这个目录。当方法遇到这个目录时,它会失败。如何查看目录是否属于系统无法打开?

【问题讨论】:

  • 它可能无法涵盖所有​​无法打开的目录,但您可以检查File#isHidden()。
  • 不要使用file.isFile() == true,而是使用file.isFile()。或者,如果您想查看是否有 false:dir.canRead() == false,请使用 !dir.canRead()。
  • @Jeffrey:我知道大型企业(>60000 人),其中 if( bool == true ) 是强制性的,而 if( b ) 是禁止的......
  • 我知道,我只希望我的代码易于阅读。

标签: java permissions directory


【解决方案1】:

当您使用file.canRead() 时,我想说您可以用try-catch 包围方法findFile(String regExp, String dirName) 的完整内容。然后,您可以捕获并记录或忽略访问错误。请尝试以下方法。

public void findFile(final String regExp, final String dirName) {
   try {
      final File dir = new File(dirName);

      if (dir.canRead() == false) {
         return;
      }

      final File[] files = dir.listFiles();

      for (final File file : files) {
         if (file.isFile() && file.getName().matches(regExp)) {
               System.out.println(file.getAbsolutePath());
         }
         if ((file.isDirectory()) && (file.canRead())) {
            findFile(regExp, file.getAbsolutePath());
         }
      }
   } catch (final IOException ignore) {
      System.out.println("No access to '"+dirName+"'.");
   }
}

【讨论】:

  • 可以,但是异常会中断递归?
  • 我不确定。当您尝试打开目录时,确切的异常(可能是堆栈跟踪)是什么?
  • 异常是:IOException.
  • 奇怪。当您使用 Java 7 时,您可以尝试 java.nio.file.Path。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2019-12-03
  • 2019-04-12
  • 2015-11-11
  • 2013-06-23
相关资源
最近更新 更多