Java находит папку «Документы и настройки» на Win 7 HP.Я не вижу никого - PullRequest
3 голосов
/ 29 января 2012

В Java я пытаюсь перечислить файлы и папки в моем каталоге C:\ и просмотреть их, используя: File[] files = new File("C:\\").listFiles();

Однако, к моему удивлению, когда я перебираю массив, я нахожу, что первый индекс - C:\Documents and Settings! Для начала я использую Windows 7 Home Premium и даже не обновил Windows XP или что-то еще, но независимо от того, что я делаю, я не вижу эту папку на своем диске, несмотря на выбор просмотра скрытых папок!?

Более того, как вы и подозреваете, когда вы начинаете использовать рекурсивный метод для просмотра каждой папки на диске, он выдает NullPointerException, как только он пытается перечислить файлы в этом каталоге.

Кто-нибудь знает, почему это так, или даже лучше, как решить проблему? Любая идея приветствуется, заранее спасибо


ОБНОВЛЕНИЕ: я сейчас очень быстро установил, что C:\Documents and Settiings является символической ссылкой или "JUNCTION" , поэтому ответьте на вопрос: как мне определить, что это символьная ссылка в Java, так что я могу сказать цикл for пропустить любой?

Ответы [ 3 ]

4 голосов
/ 29 января 2012

В моей системе Windows 7 «Документы и настройки» - это НАПРАВЛЕНИЕ для пользователей. Ваш код должен, вероятно, проверить, не является ли запись в каталоге реальной.

Чтобы увидеть это в вашей системе, выполните команду «DIR / AS C: \» из окна командной строки. Вы должны увидеть что-то вроде:

07/14/09  00:08    <JUNCTION>     Documents and Settings [C:\Users]
2 голосов
/ 29 января 2012

Хорошо, я думаю, что здесь требуется полный ответ. Здесь происходит сразу несколько вещей, которые делают его немного интереснее, чем на первый взгляд.

Да Documents and Settings - это символическая ссылка под Vista +, нет, это не проблема, которую мы имеем здесь. Настоящая проблема заключается в том, что папка имеет некоторые крайне ограниченные права доступа - по умолчанию даже администраторы не имеют к ней доступа.

Если мы читаем isSymbolicLink javadoc, он ясно заявляет:

false, если [...] невозможно определить, является ли файл символическим ссылка или нет

Поскольку у нас нет никаких прав на доступ к каталогу, мы не можем определить, является ли он символической ссылкой или нет. Но так как мы затем пытаемся получить доступ к файлу, мы получаем исключение, сообщающее, что мы не можем получить доступ к файлу.

Следовательно, правильная проверка должна выглядеть примерно так:

if (!Files.isReadable(file) || Files.isSymbolicLink(file)) continue;
1 голос
/ 29 января 2012

Я думаю, что когда вы используете Windows 7 на другом языке, кроме английского, он переводит имена папок в проводнике, но имя в файловой системе остается прежним.Если вы используете другой язык, найдите папку с именем, которая будет на вашем языке.Если нет, не берите в голову.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...