Ich bin auf einen Fehler gestoßen, hinter dem ich keine Logik zu finden scheint. Ich habe dieses Dateiobjekt, das wie folgt erstellt wird:
File file = new File("utilities/data/someTextFile.txt");
Ich mache file.exists()
es dann und es kehrt zurück false
(!?). Wenn die Datei nicht gefunden wird, melde ich mich f.getAbsolutePath()
bei einer Datei an. Wenn ich mir den Weg ansehe, scheint es in Ordnung zu sein. Ich kann den vollständigen Pfad kopieren und in das "Ausführen" -Fenster in Windows einfügen und die Datei wird einwandfrei geöffnet.
Die Datei ist jederzeit vorhanden und wird während der Ausführung meiner Anwendung weder gelöscht noch geändert. Es befindet sich am lokalen Computer.
Dies scheint nur in bestimmten Situationen aufzutreten. Ich kann den Fehler jederzeit reproduzieren, bin mir jedoch sicher, dass der Pfad des Dateiobjekts durch die von mir durchgeführten Aktionen zur Reproduktion des Fehlers nicht geändert wird.
Was kann dazu führen file.exists()
, dass false zurückgegeben wird? Hat dies etwas mit Berechtigungen oder Dateisperren usw. zu tun?
Antworten:
Ich sehe die folgende Situation unter Windows 7:
Die fragliche Datei ist "var \ log". Der absolute Pfad bezieht sich auf eine vorhandene Datei, die sich in einem normalen Unterverzeichnis befindet (kein virtueller Speicher). Dies ist aus der IDE ersichtlich.
quelle
Es scheint einen Unterschied zu geben, wie der Pfad in Java angegeben wird.
Zum Beispiel, wenn der Dateipfad wie folgt angegeben
file:/C:/DEV/test.txt
istwird zurückkehren
false
. Der Pfad funktioniert möglicherweise im Explorer oder im Browser, ist jedoch eine URL und kein absoluter Dateipfad.Auf der anderen Seite, wenn der Dateipfad wie
C:/DEV/test.txt
damals angegeben istwird zurückgegeben,
true
da der Pfad keine URL ist, sondern ein absoluter Pfad.Mit Spring Framework ist genau das der
ResourceUtils.getFile(filename)
Fall - wobei der Name entweder eine URL oder der absolute Dateipfad sein kann.quelle
file:/C:/DEV/test.txt
, als Pfadname zu arbeiten. Es ist eine URL, kein Pfadname. Während einige Leute diesen Fehler machen, gibt es keine Beweise dafür, dass das OP ...Wenn der Prozess nicht über Berechtigungen verfügt, um festzustellen, ob eine Datei vorhanden ist, wird false zurückgegeben. Es ist möglicherweise möglich, eine Datei zu öffnen, aber nicht mit normalen Methoden festzustellen, ob sie vorhanden ist.
quelle
Die obigen Antworten haben in meinem Fall nicht geholfen. Wie oben erwähnt, hatte ich:
Die Hauptursache dafür war, dass der Windows 7- Computerbesitzer die Registrierung für CMD so geändert hatte, dass ein Befehl zum Starten in einem bestimmten Verzeichnis für die Arbeit mit Python automatisch ausgeführt wurde. Diese Änderung hat den Java 1.6- Code verkrüppelt, der offenbar CMD unter Windows für bestimmte Dateivorgänge verwendet, z
exists()
. Das Problem wurde behoben, indem der Autorun aus der Registrierung entfernt wurde.quelle
()
in der zweiten Zeile danach fehlenexists
; )Natürlich gibt es eine Reihe möglicher Ursachen, und die vorherigen Antworten dokumentieren sie gut, aber hier ist, wie ich dies in einem bestimmten Fall gelöst habe:
Ein Schüler von mir hatte dieses Problem und ich riss mir fast die Haare aus, um es herauszufinden. Es stellte sich heraus, dass die Datei nicht existierte, obwohl sie so aussah. Das Problem war, dass Windows 7 so konfiguriert war, dass "Dateierweiterungen für bekannte Dateitypen ausgeblendet werden". Dies bedeutet, dass wenn die Datei den Namen "data.txt" zu haben scheint, ihr tatsächlicher Dateiname "data.txt.txt" ist.
Hoffe, das hilft anderen, sich Haare zu sparen.
quelle
Der
new File
Befehl erstellt lediglich eine Instanz einer Datei unter Verwendung des angegebenen Pfadnamens. Es wird keine Datei auf der Festplatte erstellt.Wenn du sagst
Dies kann nur dann true zurückgeben, wenn eine Datei mit demselben Pfad vorhanden war. Wenn Sie nach derselben Datei suchen möchten, die in der ersten Zeile deklariert wurde, müssen Sie sie möglicherweise auf diese Weise verwenden.
Nun wird dies wahr zurückgeben.
quelle
Wenn Sie nicht jedes Mal, wenn Sie eine Methode aufrufen müssen, getAbsoluteFile () -Aufrufe verarbeiten möchten, erstellen Sie Ihre Dateiinstanz besser bereits mit einem absoluten Pfad. Dies sollte den Trick tun:
Ich schlage vor, es mit einem Try-Catch-Block zu umgeben, übrigens.
quelle
Um das Problem zu verallgemeinern, tritt das Problem beim Konvertieren von URL / URI in lokale Pfade auf.
Hoffe das hilft.
quelle
Wenn ["Erweiterungen für bekannte Dateitypen ausblenden."] Aktiviert ist, öffnen Sie "t.txt.txt", wenn Sie "t.txt" in [Explorer] / [Windows ausführen] eingeben, programmgesteuert jedoch nicht.
quelle
Gute Antworten an alle. Ich habe festgestellt, dass dies ein Problem mit dem Zugriff von Java auf das Stammverzeichnis
C:
unter Windows zu sein scheint . Jedes andere Verzeichnis sollte in Ordnung sein, aber aus irgendeinem Grund, insbesondere durch ErwähnungC:\
oderC:
oderC:/
möglicherweise als Fehler. Ich habe dieses sehr ähnliche Problem gelöst, indem ich die Erwähnung abgefangennew File("C:");
und durch eine neue ersetzt habe,File(System.getProperty("file.separator"));
oder Sie sollten in der Lage sein, "\" fest zu codieren, anstatt "c:" als Dateiverzeichnis zu sagen, und es könnte funktionieren. Nicht elegant, aber ich habe die Arbeit für dieses Projekt erledigt.Ich hoffe, es hilft. Könnte nicht die richtige Lösung sein, aber zumindest hat es bei mir funktioniert. Ich bin dran
JRE 1.6, Win 7
. Prost!Respektvoll,
@ Carpenter1010
quelle
Wenn die Situation, in der es fehlschlägt, darin besteht, es als ein anderer Benutzer auszuführen, und Sie unter Windows Vista / Windows 7 arbeiten, kann dies durch VirtualStore verursacht werden, den Mechanismus, bei dem Windows einen nicht privilegierten Benutzer "schreiben" lässt, wo dies normalerweise nicht möglich ist. Die Änderungen werden jedoch in "% USERPROFILE% \ AppData \ Local \ VirtualStore \" gespeichert, die für jedes Benutzerkonto privat sind.
quelle
Als nichts von oben für mich funktionierte, versuchte ich es
Dadurch wird Ihre Saite von unerwünschten Zeichen befreit
quelle
Ich bin kürzlich auf dasselbe Problem gestoßen. Ich habe Netbeans deinstalliert, den Netbeans-Ordner vom Laufwerk C gelöscht, Programme, Updates, Programmdaten praktisch überall gelöscht. Dann neu installieren. Funktioniert jetzt gut. Vergessen Sie nicht, den NetBeans-Projektordner zu sichern, bevor Sie die oben genannten Aktionen ausführen.
Ich hoffe es hilft.
quelle
Bei einigen IDEs (möglicherweise) und / oder bei einigen Betriebssystemen (z. B. Fenster) haben sie standardmäßig keinen Schreibzugriff auf Dateien. Wenn Sie also versuchen, file.exists () auszuführen, wird Ihnen false angezeigt. Um dies zu beheben, gehen Sie wie folgt vor
Wenn Ihre Referenzvariable für Datei f ist, Beispiel: Datei f = neue Datei ("Pfad");
Um es zum Laufen zu bringen, wählen Sie f mit der Maus und gehen Sie dann zu Suchmenü> Schreibzugriff> Arbeitsbereich. Hoffentlich klappt es.
quelle
Ich denke, Sie sollten stattdessen Backslash verwenden, wie folgt:
Datei file = neue Datei ("C: \\ Benutzer \\ Dienstprogramme \\ Daten \\ someTextFile.txt"); (zwei Backslashes, kein Tippfehler)
Sollte das Problem lösen :)
quelle