2013-03-16 4 views
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 (этот каталог может принадлежать системе), и я не могу открыть этот каталог. Когда метод встречается с этим каталогом, он терпит неудачу. Как проверить, принадлежит ли каталог системе и не может быть открыт?

+0

Он может не охватывать все случаи неприкрытых каталогов, но вы можете проверить, есть ли файл # isHidden() '. – Vulcan

+1

Вместо использования 'file.isFile() == true' просто используйте' file.isFile() '. Или если вы пытаетесь увидеть, что-то «ложь»: 'dir.canRead() == false', просто используйте'! Dir.canRead() '. – Jeffrey

+0

@Jeffrey: Я знаю крупное предприятие (> 60000 человек), где if (bool = true) является обязательным, и если (b) запрещено ... – Aubin

ответ

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+"'."); 
    } 
} 
+0

Да, но исключение прервет рекурсию? –

+0

Только для каталога, который вы не можете прочитать. Попробуйте. (-: – vhunsicker

+0

Это работает, но нет другого способа, если вы проверите? –

Смежные вопросы