File.exists() gibt false zurück, wenn die Datei existiert

Lesezeit: 7 Minuten

Benutzer-Avatar
atsjoo

Ich bin auf einen Fehler gestoßen, für den ich keine Logik dahinter finden kann. Ich habe dieses Dateiobjekt, das wie folgt erstellt wird:

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

Ich tue es dann file.exists()und es kehrt zurück false (!?). Wenn die Datei nicht gefunden wird, melde ich mich an f.getAbsolutePath() zu einer Datei. Wenn ich mir den Pfad anschaue, scheint es in Ordnung zu sein. Ich kann den vollständigen Pfad in das “Ausführen”-Fenster in Windows kopieren und einfügen, und die Datei wird problemlos geöffnet.

Die Datei ist jederzeit vorhanden und wird während der Ausführung meiner Anwendung weder gelöscht noch verändert. Es befindet sich auf dem lokalen Rechner.

Dies scheint nur in bestimmten Situationen aufzutreten. Ich kann den Fehler jederzeit reproduzieren, aber ich bin mir sicher, dass der Pfad des Dateiobjekts durch meine Aktionen zum Reproduzieren des Fehlers nicht geändert wird.

Was kann verursachen file.exists() falsch zurückgeben? Hat das etwas mit Berechtigungen oder Dateisperren etc. zu tun?

  • Ist es also möglich, aus der Datei zu lesen, auch wenn exist() false zurückgibt?

    – Harry Kalk

    28. Mai 2009 um 9:24 Uhr

  • Ja, ich kann aus der Datei lesen, auch wenn exist() false zurückgibt.

    – atsjoo

    28. Mai 2009 um 9:37 Uhr

  • Was genau wird benötigt, um den Fehler zu reproduzieren?

    – user85421

    28. Mai 2009 um 11:05 Uhr

  • Dies befindet sich in einer Anwendung, die in Matlab geschriebene und in die Java-Anwendung kompilierte Funktionen aufruft. Es scheint, als ob Matlab-Funktionen, die das “aktuelle Verzeichnis” ändern, das Problem verursachen. Ich verwende beim Erstellen des Dateiobjekts den absoluten Pfad, daher sollte dies kein Problem sein – wie auch immer es scheint. Ich habe natürlich den absoluten Pfad des Dateiobjekts überprüft und er ist korrekt (derselbe wie vor der Änderung des aktuellen Verzeichnisses durch die Matlab-Funktion).

    – atsjoo

    28. Mai 2009 um 11:33 Uhr

  • Arbeiten Sie zufällig gegen ein entferntes Verzeichnis (z. B. einen NFS-Mount)?

    – Tomer Gabel

    3. August 2009 um 3:10 Uhr

Benutzer-Avatar
RomanZenka

Ich sehe die folgende Situation unter Windows 7:

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

Die fragliche Datei ist “var\log”, der absolute Pfad verweist auf eine vorhandene Datei, die sich in einem normalen Unterverzeichnis (kein virtueller Speicher) befindet. Dies wird von der IDE aus gesehen.

  • Ich habe es gerade herausgefunden: bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097 Anscheinend werden die auf Datei ausgeführten Operationen für das aktuelle Verzeichnis aufgelöst, während getAbsolutePath für user.dir aufgelöst wird. Wenn diese beiden Pfade nicht übereinstimmen, erhalten Sie widersprüchliche Ergebnisse. Teuflisch!

    – Roman Zenka

    8. Juli 2010 um 14:36 ​​Uhr

  • Ich habe genau das gleiche Problem, bei dem ich versucht habe, beide Methoden zu verwenden, um zu überprüfen, ob die Datei vorhanden ist, und trotzdem bekomme ich nur unter Windows 7 falsch! Irgendeine Idee?

    – Dejell

    20. September 2010 um 9:26 Uhr

  • @Odelya: Welche IDE verwendest du? Auf was ist deine -Duser.dir eingestellt? Mein Problem wurde dadurch verursacht, dass -Duser.dir in ein anderes Verzeichnis als das aktuelle Arbeitsverzeichnis gesetzt wurde.

    – Roman Zenka

    22. September 2010 um 14:26 Uhr

  • Für jeden, der an einem dynamischen Webprojekt arbeitet, löst die Verwendung von file.exists() eine Ausnahme aus, verwenden Sie file.getAbsoluteFile().exists(), um nach Dateien im WEB-INF-Verzeichnis zu suchen (allgemeiner Tipp, nicht Windows 7-spezifisch ).

    – PS

    21. April 2016 um 9:22 Uhr


  • @RomanZenka Der Link ist kaputt, der funktionierende ist bugs.java.com/bugdatabase/view_bug.do?bug_id=4483097

    – kutschkem

    1. August um 15:37 Uhr

Benutzer-Avatar
Garima Bathla

Es scheint, als ob es einen Unterschied gibt, wie der Pfad in Java angegeben wird.

Wenn der Dateipfad beispielsweise als angegeben ist file:/C:/DEV/test.txt dann

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

wird zurückkehren false. Der Pfad funktioniert möglicherweise im Explorer oder im Browser, aber es ist eine URL und kein absoluter Dateipfad.

Aber andererseits, wenn der Dateipfad als angegeben ist C:/DEV/test.txt dann

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

wird zurückkehren true weil der Pfad keine URL ist, sondern ein absoluter Pfad.

Mit Frühlingsrahmen genau das ist es ResourceUtils.getFile(filename) tut – wobei name entweder eine URL oder der absolute Dateipfad sein kann.

  • Ich würde nicht erwarten file:/C:/DEV/test.txt als Pfadname arbeiten. Es ist eine URL, kein Pfadname. Während einige Leute diesen Fehler machen, gibt es keine Beweise dafür, dass das OP …

    – Stefan C

    27. Oktober 2014 um 22:43 Uhr


Wenn der Prozess nicht über die Berechtigung verfügt, festzustellen, ob eine Datei vorhanden ist, gibt er „false“ zurück. Es kann möglich sein, eine Datei zu öffnen, aber mit normalen Methoden nicht festzustellen, ob sie existiert.

  • Interessant. Können Sie das erweitern? Welche spezifischen Berechtigungen haben Sie im Sinn?

    – Clemens

    21. November 2011 um 23:44 Uhr

  • Hier kann die Fähigkeit java.nio.file.AccessDeniedException blockieren, um die Existenz von Dateien/Verzeichnissen zu erreichen. Wenn Sie beispielsweise Verzeichnis in FAR oder einem anderen Datei-Explorer geöffnet lassen, dann Verzeichnis mit allen verschachtelten Dateien löschen und die Existenz dieses Verzeichnisses überprüfen, können Sie AccessDeniedException (erweitert IOException) für temporäre Dateien erhalten, die für Sie aufbewahrt werden. In diesem Fall gibt Files.exists für IOException false zurück.

    – Alfira

    10. April 2017 um 14:27 Uhr

Benutzer-Avatar
Karl Lew

Die obigen Antworten haben in meinem Fall nicht geholfen. Wie oben beschrieben hatte ich:

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

Die Hauptursache dafür war, dass die Windows 7 Der Maschinenbesitzer hatte die Registrierung für CMD so geändert, dass ein Befehl automatisch ausgeführt wurde, um in einem bestimmten Verzeichnis zu starten, um mit Python zu arbeiten. Diese Modifikation verkrüppelte die Java 1.6 Code, der anscheinend verwendet CMD an Fenster für bestimmte Dateioperationen, wie z exists(). Das Entfernen des Autorun aus der Registrierung löste das Problem.

Wann [“Hide extensions for known file types.”] ist aktiviert Windows öffnet “t.txt.txt”, wenn Sie “t.txt” eingeben [explorer]/[run windows] aber programmatisch nicht.

  • Ich hatte dieses Problem, und das Problem war, dass ich eine txt-Datei mit dem Namen „testFile.txt“ in C:\test erstellt habe. Ich habe auf diese Datei über den Pfad C:\test\testFile.txt verwiesen, was nicht funktioniert hat. Dies lag daran, dass die Datei tatsächlich als testFile.txt.txt gespeichert wurde, daher die positive Abstimmung über die obige Lösung (alte Frage, aber keine akzeptierte Antwort!)

    – Die schwarze Nacht

    22. Februar 2012 um 8:51 Uhr


  • Gott, Windows saugt so sehr.

    – aafc

    31. Januar 2014 um 16:54 Uhr

Benutzer-Avatar
petehern

Offensichtlich gibt es eine Reihe möglicher Ursachen und die vorherigen Antworten dokumentieren sie gut, aber so habe ich das in einem bestimmten Fall gelöst:

Ein Schüler von mir hatte dieses Problem und ich raufte mir fast die Haare, als ich versuchte, es herauszufinden. Es stellte sich heraus, dass die Datei nicht existierte, obwohl es so aussah. Das Problem war, dass Windows 7 so konfiguriert war, dass „Dateierweiterungen für bekannte Dateitypen ausgeblendet werden“. Das bedeutet, dass, wenn die Datei den Namen „data.txt“ zu haben scheint, ihr tatsächlicher Dateiname „data.txt.txt“ lautet.

Hoffe, das hilft anderen, sich ein paar Haare zu sparen.

  • Ich hatte dieses Problem, und das Problem war, dass ich eine txt-Datei mit dem Namen „testFile.txt“ in C:\test erstellt habe. Ich habe auf diese Datei über den Pfad C:\test\testFile.txt verwiesen, was nicht funktioniert hat. Dies lag daran, dass die Datei tatsächlich als testFile.txt.txt gespeichert wurde, daher die positive Abstimmung über die obige Lösung (alte Frage, aber keine akzeptierte Antwort!)

    – Die schwarze Nacht

    22. Februar 2012 um 8:51 Uhr


  • Gott, Windows saugt so sehr.

    – aafc

    31. Januar 2014 um 16:54 Uhr

Benutzer-Avatar
Franz Marzoa

Wenn Sie sich nicht jedes Mal mit getAbsoluteFile()-Aufrufen befassen möchten, wenn Sie eine Methode aufrufen müssen, erstellen Sie Ihre Dateiinstanz besser bereits mit einem absoluten Pfad. Das sollte den Trick machen:

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

Ich schlage vor, es mit einem Try-Catch-Block zu umgeben, BTW.

1282570cookie-checkFile.exists() gibt false zurück, wenn die Datei existiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy