File.listFiles () и отличение физических папок от виртуальных - PullRequest
3 голосов
/ 01 июля 2010

Метод File.listFiles() выводит содержимое папки. В Windows, однако, когда вы вызываете метод на корневом диске, он также выдает некоторые - в отсутствие лучшей фразы - «виртуальные» папки (например, «Документы и настройки», которые были заменены на «Пользователи» в последних версиях Windows). .

Если вы затем вызываете listFiles () для одной из этих «виртуальных» папок, она всегда возвращает ноль. И вот где моя проблема, так как я хочу рекурсивно пройтись по всем папкам. Мне нужен способ отфильтровать эти папки и желательно не проверять их имена ...

Существуют также некоторые дополнительные папки, которые обычный пользователь не видит (например, «Информация о томе системы» или папка корзины для этого диска), и я был бы рад найти метод фильтрации из них как ну без внесения в черный список имен.

К сожалению, эти папки ведут себя как настоящие. Я ищу что-то вроде File.isSystemFolder() -метода.

Я очень благодарен за любой совет

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Вы можете отфильтровать эти скрытые системные папки, проверив, вернет ли File#isHidden() true.

Я не уверен насчет "виртуальных" папок.Я думаю, что отличить их можно только с помощью New IO 2 , который появится в Java 7. Сначала я должен проверить это на компьютере с Vista / Win7 (сейчас я нахожусь на XP).


Обновление : я провел быстрый тест на нашем сервере 2K3, Документы и настройки по умолчанию также возвращают true для File#isHidden(), в то время как Пользователи нет.Вы могли бы также использовать это.

0 голосов
/ 01 июля 2010

Я не думаю, что вам повезет с методом File.isSystemFolder, потому что я не могу себе представить, что было бы легко навязать определение "системная папка", которое является достаточно широким для JVM в различных операционных областях.системы, чтобы быть в состоянии реализовать правильно и с пользой.Как предлагает Балус, проверка на наличие скрытых папок является хорошим началом и вполне может быть достаточной сама по себе (поскольку это копирует то, что они увидят в оболочке проводника).

Сначала о «виртуальных» папкахВы уверены, что они виртуальные?Разве C:\Documents and Settings (или позже C:\Users) не является реальным каноническим путем для этой папки?Если это не так, то вы могли бы легко отсеять их на окнах, увидев getCanonicalPath().equals(getAbsolutePath()) (если вы готовы к нескольким ложным срабатываниям с лишними . с и .. с).

Если это не работает, то это просто обычная папка - вам нужно подумать о том, какие логические свойства у этих папок, которые делают их «виртуальными».Или, другими словами, придумайте некоторый предикат, который можно выразить в терминах методов на File, который захватывает то, что вы хотите отфильтровать.Даже я не уверен прямо сейчас, что бы и не подходило, основываясь на вашем английском описании.

...