Was sind mögliche Ursachen für java.io.IOException: "Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch"
Ich versuche, eine Datei zu kopieren mit dem folgenden code:
File targetFile = new File(targetPath + File.separator + filename);
...
targetFile.createNewFile();
fileInputStream = new FileInputStream(fileToCopy);
fileOutputStream = new FileOutputStream(targetFile);
byte[] buffer = new byte[64*1024];
int i = 0;
while((i = fileInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, i);
}
Für einige Benutzer die targetFile.createNewFile
Ergebnisse in dieser Ausnahme:
java.io.IOException: The filename, directory name, or volume label syntax is incorrect
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:850)
Dateinamen und Verzeichnis-Namen scheinen richtig zu sein. Das Verzeichnis targetPath
wird auch überprüft, für die Existenz, bevor die Kopie-code ausgeführt und der Dateiname sieht wie folgt aus: AB_timestamp.xml
Der Benutzer hat Schreibzugriff auf die targetPath
und kopieren kann die Datei ohne Probleme mit dem OS.
Als ich don ' T haben Zugang zu einer Maschine, so geschieht dies doch und kann nicht reproduzieren Sie das problem auf meine eigene Maschine, die ich an Sie wenden, um Hinweise auf den Grund für diese Ausnahme.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese, wie es dauert, mehr Pflege anpassen Verzeichnis, separator-Zeichen im Pfad zwischen Zielpfad und Dateiname:
Nur ich hatte das gleiche problem. Ich denke, es hat etwas zu tun mit write-Zugriff. Ich habe die Fehler beim schreiben auf c:\ sondern auf der änderung auf D:\ alles geklappt hat.
Anscheinend Java nicht über die Berechtigung zum schreiben in mein System-Laufwerk (unter Windows 7 installiert auf C:)
FYI, ich habe dann bei meinem Dateinamen hatte einen timestamp mit Doppelpunkte, dh
myfile_HH:mm:ss.csv
Doppelpunkte Entfernen wurde das Problem behoben.Hier ist das test-Programm, das ich verwenden
Versuchen, die Datei in einem anderen Verzeichnis, z.B. "C:\" nachdem Sie sicher, dass Sie Schreibzugriff auf dieses Verzeichnis haben. Wenn das funktioniert, ist der Pfad den Namen der Datei falsch ist.
Werfen Sie einen Blick auf die Kommentar in der Ausnahme und versuchen zu variieren, alle Elemente im Pfad den Namen der Datei. Experiment. Schlussfolgerungen zu ziehen.
Überprüfen Sie, dass der Zielpfad ein Verzeichnis ist, oder nur, dass etwas existiert mit diesem Namen? (Ich weiß, Sie sagen, der Benutzer kann kopieren Sie es aus dem Betriebssystem, aber vielleicht haben Sie ja irgendetwas anderes).
Tut targetPath Ende mit einer Datei.separator bereits?
(Es würde helfen, wenn Sie könnte sich melden und uns sagen, was der Wert von Zielpfad und Dateiname sind auf ein Versagen Fall)
Vielleicht das problem ist, dass es mit dem kopieren der Datei über das Netzwerk auf ein freigegebenes Laufwerk? Ich glaube java kann es zu Problemen beim schreiben von Dateien mithilfe von NFS, wenn der Pfad ist so etwas wie \MeinPC\myshared Ordner.
Was ist der Pfad, wo dieses problem Auftritt?
Versuchen Sie, einige der Protokollierung genau zu sehen, was ist der name und Pfad der Datei versucht zu erstellen, um sicherzustellen, dass die Eltern, sowie ein Verzeichnis.
Darüber hinaus können Sie auch einen Blick auf die Kanäle anstelle der Verwendung einer Schleife. 😉
Sagen: "für einige Nutzer" - so klappt es bei anderen? Was ist hier der Unterschied, sind die Benutzer mit verschiedenen Instanzen auf verschiedenen Rechnern, oder ist das ein server, der Dienste gleichzeitige Benutzer?
Falls letzteres, würde ich sagen, es ist eine Parallelität bug irgendwie zwei threads überprüfen, versuchen Sie, erstellen Sie die Datei mit WinNTFileSystem.createFileExclusively(Native-Methode) simultan.
Weder createNewFile oder createFileExclusively synchronisiert werden, wenn ich einen Blick in die OpenJDK-Quelle, so können Sie synchronisieren müssen, diese blockieren sich selbst.
Vielleicht ist die Datei bereits vorhanden ist. Es könnte der Fall sein, wenn dein timestamp-Auflösung ist nicht gut genug. Wie es ist eine IOException, die Sie bekommen, könnte es nicht sein, eine Erlaubnis (in diesem Fall erhalten Sie eine SecurityException).
Ich würde zuerst prüfen, ob Datei vorhanden ist, bevor versucht wird, erstellen Sie die Datei, und versuchen Sie, melden Sie, was passiert.
Blick auf public boolean createNewFile() für weitere Informationen über die Methode, die Sie verwenden.
Als ich war nicht in der Lage, den Fehler zu reproduzieren auf meine eigene Maschine oder die Hände bekommen, auf der Maschine des Benutzers, in dem der code versagt wartete ich, bis jetzt zu erklären, eine akzeptierte Antwort.
Ich änderte den code wie folgt:
Danach arbeitete er für den Benutzer das problem meldet.
So scheint es Alexanders Antwort hat den trick, obwohl ich eigentlich eine etwas andere Konstruktor als er gab, aber auf der gleichen Linie.
Ich noch zu sprechen haben, die Benutzer zu helfen, mich zu überprüfen, dass die code-änderung den Fehler behoben (anstatt ihm etwas anders) durch läuft die alte version wieder und prüfen wenn es immer noch nicht.
btw. Anmeldung an Ort und Stelle war, und der angemeldete Weg schien ok - sorry für die nicht erwähnen, dass. Ich fand das für selbstverständlich und finden es unnötig kompliziert den code in die Frage.
Danke für die hilfreichen Antworten.
Einen sehr ähnlichen Fehler:-
"... java.io.IOException: Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch"
wurde erstellt in Eclipse für mich, wenn die TOMCAT-home-Einstellung hatte eine Ausbildung backslash.
Geringfügige Bearbeiten schlug bei:-
http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-filename-directory
es fest für mich.
Entfernen Sie alle Sonderzeichen in den Datei - /Ordner-Namen in den kompletten Pfad an.