Подтвердить что ты не робот

File.exists() возвращает false, когда файл существует

Я столкнулся с ошибкой, по которой я не могу найти никакой логики. У меня есть этот объект File, который создается следующим образом:

File file = new File("utilities/data/someTextFile.txt");

Затем я делаю file.exists(), и он возвращает false (!?). Если файл не найден, я регистрирую f.getAbsolutePath() в файле. Когда я смотрю на путь, кажется, все в порядке. Я могу скопировать полный путь в окно "Запустить" в Windows, и файл открывается нормально.

Файл существует во все времена и не удаляется и не изменяется во время работы моего приложения. Он расположен на локальной машине.

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

Что может заставить file.exists() вернуть false? Связано ли это с разрешениями или файловыми замками и т.д.?

4b9b3361

Ответ 1

Я вижу следующую ситуацию в Windows 7:

file.exists() == false
file.getAbsoluteFile().exists() == true

Этот файл представляет собой "var\log", абсолютный путь относится к существующему файлу, который находится в нормальном подкаталоге (а не в виртуальном хранилище). Это видно из IDE.

Ответ 2

Кажется, есть разница в том, как путь указан в Java.

Например, если путь к файлу указан как file:/C:/DEV/test.txt, то

File f = new File(filename);
f.exists();

вернет false. Путь может работать в проводнике или в браузере, но это URL-адрес, а не абсолютный путь к файлу.

Но, с другой стороны, если путь к файлу указан как C:/DEV/test.txt, то

File f = new File(filename);
f.exists();

вернет true, потому что путь не является URL-адресом, но является абсолютным путем.

С Spring Framework, что и делает ResourceUtils.getFile(filename) - где имя может быть либо URL-адресом, либо абсолютным файловым путем.

Ответ 3

Если у процесса нет разрешений, чтобы определить, существует ли файл, он вернет false. Возможно, можно открыть файл, но не сказать обычными методами, если он существует.

Ответ 4

Вышеупомянутые ответы не помогли мне в этом случае. Как указано выше, у меня было:

file.exists() => false
file.getAbsoluteFile().exists => true

Основная причина этого заключалась в том, что владелец машины Windows 7 изменил реестр для CMD, чтобы он автоматически запускал команду для запуска в определенном каталоге для работы с Python. Эта модификация искалечила код Java 1.6, который, по-видимому, использует CMD для Windows для определенных файловых операций, таких как exists(). Устранение автозапуска из реестра решило проблему.

Ответ 5

Команда new File просто создает экземпляр файла с использованием указанного имени пути. На самом деле он не создает файл на жестком диске.

Если вы скажете

File file = new File ("path");
file.exists() 

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

File file = new File ("path");
file.createNewFile();
file.exists();

Теперь это вернет true.

Ответ 6

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

File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();

Я предлагаю окружить его блоком try-catch, BTW.

Ответ 7

Очевидно, существует ряд возможных причин, и предыдущие ответы хорошо документируют их, но вот как я решил это в одном конкретном случае:

У моего ученика была эта проблема, и я чуть не разорвал свои волосы, пытаясь понять это. Оказалось, что файл не существует, хотя он выглядел так, как будто это было. Проблема заключалась в том, что Windows 7 была настроена на "Скрыть расширения файлов для известных типов файлов". Это означает, что если файл имеет имя "data.txt", его фактическое имя файла "data.txt.txt".

Надеюсь, это поможет другим спасти себя от волос.

Ответ 8

Когда [ "Скрыть расширения для известных типов файлов." ] проверяется, что окна открывают "t.txt.txt", когда тип "t.txt" в [explorer]/[run windows], но программно нет.

Ответ 9

Чтобы обобщить проблему, проблема возникает при преобразовании URL/URI в локальные пути.

Example: URL url = file:/D:/code%20repo%20sample/sample.txt

// To remove url reference
String localPath = url.getPath();  
> /D:/code%20repo%20sample/sample.txt

// Decoding reserved characters in url from hexadecimal to character
URLDecoder.decode(localPath, StandardCharsets.UTF_8.toString()); 
> /D:/code repo sample/sample.txt

Надеюсь, это поможет.

Ответ 10

Если ситуации, в которых он терпит неудачу, включают запуск его как другого пользователя, и вы находитесь в Windows Vista Vista/Windows 7, это может быть вызвано VirtualStore, механизм, в котором Windows позволяет непривилегированному пользователю "писать", не могу. Однако изменения сохраняются в "% USERPROFILE%\AppData\Local\VirtualStore \", которые являются закрытыми для каждой учетной записи пользователя.

Ответ 11

Хорошие ответы на всех. Я обнаружил, что это похоже на проблему с Java, которая обращается к корневому каталогу C: в Windows. Любой другой каталог должен быть точным, но по какой-то причине конкретное упоминание C:\ или C: или C:/ может привести к ошибке. Я решил эту очень схожую проблему, помещая упоминание в new File("C:"); и заменяя ее новым File(System.getProperty("file.separator"));, или вы должны иметь возможность жесткого кода "\" вместо того, чтобы говорить "c:" как свой каталог файлов, и это может сработать. Не изящно, но получил работу для меня в этом проекте.

Надеюсь, это поможет. Не может быть правильного решения, но, по крайней мере, это сработало для меня. Я нахожусь на JRE 1.6, Win 7. Ура!

С уважением,

@Carpenter1010

Ответ 12

Когда у меня ничего не сработало, я попытался

filePath = filePath.trim();

Это очистит вашу строку от любого нежелательного персонажа

Ответ 13

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

Файл файла = новый файл ( "C:\\Пользователь\\утилит\\data\\someTextFile.txt" ); (две обратные косые черты, а не опечатка)

Должна решить проблему:)