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

+0

它可能无法覆盖所有无法打开的目录,但可以检查'File#isHidden()'。 – Vulcan 2013-03-16 21:33:12

+1

而不是使用'file.isFile()== true',只需使用'file.isFile()'。或者,如果你想查看是否有'false':'dir.canRead()== false',只需使用'!dir.canRead()'。 – Jeffrey 2013-03-16 21:33:43

+0

@Jeffrey:我知道大企业(> 60000人),其中,如果(布尔==真)是强制性的,如果(B)禁止... – Aubin 2013-03-16 21:36:50

回答

4

因为您已经使用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+"'."); 
    } 
} 
+0

是的,但异常会中断递归? – 2013-03-16 21:38:54

+0

仅适用于您无法阅读的目录。试试看。 ( - : – vhunsicker 2013-03-16 21:45:46

+0

它的工作原理,但没有另一种方式,如果检查 – 2013-03-16 21:46:45

相关问题