1

我正在用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(该目录可能属于系统)的隐藏目录,我无法打开该目录。当方法遇到这个目录时,它会失败。如何检查目录是否属于系统并且无法打开?

4

1 回答 1

4

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

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+"'.");
   }
}
于 2013-03-16T21:35:52.757 回答