2013-04-09 4 views
3

У меня возникла ситуация, когда мне нужно запустить «предварительную проверку», чтобы узнать, является ли каталог «createdable». Это не проблема, просто запустите file.mkdirs() и посмотрите, вернет ли он true.Отменить эффекты java mkdirs()

Проблема в том, что я хотел бы очистить после этой проверки. Это немного сложно, потому что я хочу удалить только те папки и подпапки, которые фактически создали mkdirs().

Может ли кто-нибудь подумать об умном способе сделать это?

+6

Не проще ли комбинировать файлы File.exists(), File.isDirectory() и File.canWrite(), а не выяснять, как отменить эффекты mkdirs()? –

ответ

2

Я думаю, что этот метод делает работу без вас позвонить mkdirs:

public static boolean canMkdirs(File dir) { 
    if(dir == null || dir.exists()) 
     return false; 
    File parent = null; 
    try { 
     parent = dir.getCanonicalFile().getParentFile(); 
     while(!parent.exists()) 
      parent = parent.getParentFile(); 
    } catch(NullPointerException | IOException e) { 
     return false; 
    } 
    return parent.isDirectory() && parent.canWrite(); 
} 
+1

Мне нравится этот подход, потому что после него нет очистки. Он работает с предположением, что если у вас есть доступ на запись в каталог, вы сможете создать необходимые подкаталоги в этом каталоге. Это, однако, не тест, который на 100% эффективен. Рассмотрим имена путей, содержащие недопустимые символы, или путь, который нарушает общую длину, допустимую ОС или базовой файловой системой. Эти вещи не проверяются методом выше. Но это достаточно близко для моих нужд. Большое спасибо! – user1283068

0

Сохраните один массив, который содержит имя этого каталога. поэтому, когда вы хотите удалить dir, вы можете удалить этот контент массива/string/dir-name для удаления.

0

Немного опасно:

if (file.mkdirs()) { 
    long t0 = file.lastModified(); 
    for (;;) { 
     long t = file.lastModified(); 
     if (t < t0 - 1000L) { // Created longer than it's child minus 1 s? 
      break; 
     } 
     t0 = t; 
     file.delete(); 
     file = file.getParentFile(); 
    } 
} 
0

Если мое предположение, что разрешения наследуются в файловой структуре является правильным, что-то вроде этого следует сделать это:

File f = new File("C:\\doesntExist\\Nope\\notHere"); 
File tempFile = f; 
while (!tempFile.exists()) 
    tempFile = tempFile.getParentFile(); 
if (!tempFile.canWrite() 
    && tempFile.isDirectory()) // Copied this line from Lone nebula's answer (don't tell anyone, ok?) 
    System.out.println("Can't write!"); 
else 
{ 
    f.mkdirs(); 
    ... 
} 
1

Судя по mkdirs() source code:

public boolean mkdirs() { 
     if (exists()) { 
      return false; 
     } 
     if (mkdir()) { 
      return true; 
     } 
     File canonFile = null; 
     try { 
      canonFile = getCanonicalFile(); 
     } catch (IOException e) { 
      return false; 
     } 

     File parent = canonFile.getParentFile(); 
     return (parent != null && (parent.mkdirs() || parent.exists()) && 
       canonFile.mkdir()); 
    } 

Если бы я не пропустил что-то у вас есть два варианта:

  • Remeber состояние файлов на диске перед вызовом mkdirs(), сравнить его с состоянием после mkdirs(), если необходимо,
  • расширить класс File и переопределить метод mkdirs(), чтобы точно запомнить, какие файлы были созданы. Если они созданы, обработайте их.

Последний кажется более элегантным решением, которое даст меньше кода.

UPDATE:

Я настоятельно рекомендую принять во внимание Давидовом. комментарий.

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

  • Нет связанных вопросов^_^