1

Javaでシェルを開発しています。このシェルはコマンドを実行でき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

すでに使用しているように、メソッドの完全なコンテンツをtry-catchfile.canRead()で囲むことができると思います。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+"'.");
   }
}
于 2013-03-16T21:35:52.757 に答える