Я столкнулся с ошибкой, в которой не могу найти никакой логики. У меня есть этот объект File, который создается следующим образом:
File file = new File("utilities/data/someTextFile.txt");
Я тогда делаю file.exists()
, и он возвращается false
(!?). Если файл не найден, я вхожу f.getAbsolutePath()
в файл. Когда я смотрю на тропинку, все в порядке. Я могу скопировать и вставить полный путь в окно «Выполнить» в Windows, и файл откроется нормально.
Файл существует постоянно, не удаляется и не изменяется во время работы моего приложения. Он находится на локальной машине.
Это происходит только в определенных ситуациях. Я могу воспроизвести ошибку в любое время, но я уверен, что путь к файловому объекту не изменится из-за действий, которые я совершаю для воспроизведения ошибки.
Что может привести file.exists()
к возврату false? Связано ли это с разрешениями или блокировками файлов и т. Д.?
Ответы:
В Windows 7 я вижу следующую ситуацию:
file.exists() == false file.getAbsoluteFile().exists() == true
Рассматриваемый файл - "var \ log", абсолютный путь действительно относится к существующему файлу, который находится в обычном подкаталоге (не в виртуальном хранилище). Это видно из IDE.
источник
Похоже, что есть разница в том, как путь указывается в Java.
Например, если путь к файлу указан как
file:/C:/DEV/test.txt
тоFile f = new File(filename); f.exists();
вернется
false
. Путь может работать в проводнике или браузере, но это URL-адрес, а не абсолютный путь к файлу.Но с другой стороны, если путь к файлу указан как
C:/DEV/test.txt
thenFile f = new File(filename); f.exists();
вернется,
true
потому что путь не является URL-адресом, но является абсолютным путем.В Spring Framework это именно то, что
ResourceUtils.getFile(filename)
делает - где имя может быть либо URL-адресом, либо абсолютным путем к файлу.источник
file:/C:/DEV/test.txt
работать как путь. Это URL-адрес, а не путь. Хотя некоторые люди совершают эту ошибку, нет никаких доказательств того, что ОП имеет ...Если у процесса нет разрешений на определение существования файла, он вернет false. Возможно, файл можно открыть, но обычными методами нельзя сказать, существует ли он.
источник
Приведенные выше ответы не помогли в моем случае. Как было сказано выше, у меня было:
file.exists() => false file.getAbsoluteFile().exists => true
Основная причина этого заключалась в том, что владелец компьютера с Windows 7 изменил реестр для CMD, чтобы он автоматически запускал команду для запуска в определенном каталоге для работы с Python. Эта модификация привела к повреждению кода Java 1.6, который явно использует CMD в Windows для определенных файловых операций, таких как
exists()
. Устранение автозапуска из реестра решило проблему.источник
()
во второй строке послеexists
; )Когда установлен флажок [«Скрывать расширения для известных типов файлов.»], Окна открывают «t.txt.txt» при вводе «t.txt» в [проводнике] / [запускать окна], но программно нет.
источник
Очевидно, существует ряд возможных причин, и предыдущие ответы хорошо документировали их, но вот как я решил это в одном конкретном случае:
У моего ученика была эта проблема, и я чуть не вырвал себе волосы, пытаясь понять ее. Оказалось, что файла не существует, хотя, похоже, он существовал. Проблема заключалась в том, что Windows 7 была настроена на «Скрытие расширений файлов для известных типов файлов». Это означает, что если файл имеет имя «data.txt», его фактическое имя файла - «data.txt.txt».
Надеюсь, это поможет другим сберечь себе волосы.
источник
Команда
new File
просто создает экземпляр файла, используя заданное имя пути. На самом деле он не создает файл на жестком диске.Если вы скажете
File file = new File ("path"); file.exists()
Это может вернуть истину, только если существовал файл с таким же путем. Если вы намеревались проверить тот же файл, объявленный в первой строке, вам может потребоваться использовать его таким образом.
File file = new File ("path"); file.createNewFile(); file.exists();
Теперь это вернет истину.
источник
Если вы не хотите иметь дело с вызовами getAbsoluteFile () каждый раз, когда вам нужно вызвать метод, вам лучше создать экземпляр файла с абсолютным путем. Это должно помочь:
File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();
Я предлагаю окружить его блоком try-catch, BTW.
источник
Чтобы обобщить проблему, проблема возникает при преобразовании 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
Надеюсь это поможет.
источник
Всем хорошие отзывы. Я обнаружил, что это проблема с доступом Java к корневому
C:
каталогу в Windows. Любой другой каталог должен быть хорошо, но по какой - то причине, в частности , упомянутьC:\
илиC:
илиC:/
может дать ошибку. Я решил эту очень похожую проблему, перехватив упоминаниеnew File("C:");
и заменив его новым,File(System.getProperty("file.separator"));
иначе вы сможете жестко закодировать «\» вместо «c:» в качестве каталога с файлами, и это может сработать. Не изящно, но выполнил работу за меня в этом проекте.Я надеюсь, что это помогает. Возможно, это неправильное решение, но, по крайней мере, оно сработало для меня. Я иду
JRE 1.6, Win 7
. Ура!С уважением,
@ Carpenter1010
источник
Если в ситуациях, когда он терпит неудачу, запускается его от имени другого пользователя, и вы используете Windows Vista / Windows 7, это может быть вызвано VirtualStore, механизмом, при котором Windows позволяет непривилегированному пользователю «писать», чего он обычно не может. Однако изменения хранятся в "% USERPROFILE% \ AppData \ Local \ VirtualStore \", который является частным для каждой учетной записи пользователя.
источник
Когда у меня ничего сверху не работало, я попробовал
Это очистит вашу строку от любых нежелательных символов.
источник
FWIW, есть еще одно место, где это происходит.
File("")
это имя текущего каталога.File("").exists()
обычно вернусьfalse
.File(("").getAbsoluteFile().exists()
Трюк работает и будет возвращатьtrue
(предполагая , текущий каталог существует ...)источник
Недавно я столкнулся с этой же проблемой. Я удалил Netbeans, удалил папку netbeans с диска C, программные файлы, update, programData практически везде. Затем переустановите. Сейчас работает нормально. Не забудьте сделать резервную копию папки проекта netbeans, прежде чем предпринимать действия, указанные выше.
Надеюсь, поможет.
источник
С некоторой IDE (может быть) и / или с некоторой ОС (например: window) по умолчанию у них нет доступа на запись в файлы. Поэтому, если вы попытаетесь выполнить file.exists (), он покажет вам false. чтобы исправить это, сделайте как показано ниже
если ваша переменная ref для File - f, например: File f = new File ("path");
поэтому, чтобы заставить его работать, выберите f мышью и затем перейдите в меню «Поиск»> «Доступ для записи»> «Рабочая область». Надеюсь, это сработает.
источник
Я думаю, вам следует использовать обратную косую черту, например:
Файл file = новый файл ("C: \\ User \\ utilities \\ data \\ someTextFile.txt"); (две обратные косые черты, а не опечатка)
Должно решить проблему :)
источник