Was sind mögliche Gründe für java.io.IOException: „Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch“

StackOverflow https://stackoverflow.com/questions/131901

  •  02-07-2019
  •  | 
  •  

Frage

Ich versuche, eine Datei mit dem folgenden Code zu kopieren:

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 der 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)

Dateiname und Verzeichnisnamen scheinen korrekt zu sein. Das Verzeichnis targetPath wird sogar die Existenz überprüft, bevor die Kopie Code ausgeführt wird und der Dateiname wie folgt aussieht: AB_timestamp.xml

Der Benutzer hat Schreibberechtigungen für die targetPath und kann die Datei ohne Probleme mit dem O kopiert werden.

Wie ich haben keinen Zugang zu einer Maschine dies geschieht noch auf und kann das Problem nicht auf meinem eigenen Rechner reproduzieren ich für Hinweise auf den Grund für diese Ausnahme an Sie wenden.

War es hilfreich?

Lösung

Versuchen Sie diese, da es mehr Pflege von Verzeichnistrennzeichen Einstellung auf dem Weg zwischen targetPath und den Dateinamen nimmt:

File targetFile = new File(targetPath, filename);

Andere Tipps

Ich traf nur das gleiche Problem. Ich denke, es hat etwas mit Schreibzugriffsberechtigung zu tun. Ich habe den Fehler bei dem Versuch, c zu schreiben: \ aber beim Wechsel zu D: \ alles hat gut funktioniert. Offenbar Java hatte nicht die Erlaubnis, mein System Drive zu schreiben (unter Windows 7 installiert auf C:)

Zur Info, ich habe dann, wenn meine Dateinamen einen Zeitstempel mit Doppelpunkten hatten, dh myfile_HH:mm:ss.csv Entfernen Doppelpunkte das Problem behoben.

Hier ist das Testprogramm verwende ich

import java.io.File;
public class TestWrite {

    public static void main(String[] args) {
        if (args.length!=1) {
            throw new IllegalArgumentException("Expected 1 argument: dir for tmp file");
        }
        try  {
            File.createTempFile("bla",".tmp",new File(args[0]));
        } catch (Exception e) {
            System.out.println("exception:"+e);
            e.printStackTrace();
        }
    }
}

Versuchen Sie die Datei in einem anderen Verzeichnis erstellen - zum Beispiel „C: \“, nachdem Sie sich vergewissern Sie Schreibzugriff auf das Verzeichnis haben. Wenn das funktioniert, ist der Pfadname der Datei falsch.

Werfen Sie einen Blick auf den Kommentar in der Exception und versuchen, alle Elemente variieren im Pfadnamen der Datei. Experiment. Schlussfolgerungen ziehen.

Kontrollieren Sie, dass die targetPath ein Verzeichnis ist, oder einfach nur, dass etwas existiert mit diesem Namen? (Ich weiß, sagen Sie der Benutzer sich aus dem Betriebssystem kopieren, aber vielleicht etwas anderes sie eingeben).

Hat targetPath mit einem File.separator enden schon?

(Es würde helfen, wenn Sie sich könnte und uns sagen, was der Wert von targetPath und Dateinamen auf einem fehlerhaften Fall)

Vielleicht ist das Problem ist, dass es die Datei über das Netzwerk kopiert, auf einem gemeinsam genutzten Laufwerk? Ich denke, Java kann Probleme haben, beim Schreiben von Dateien mit NFS, wenn der Pfad so etwas wie \ mypc \ myshared Ordner ist.

Was ist der Pfad, in dem dieses Problem auftritt?

Versuchen Sie einige Protokollierung hinzugefügt, genau zu sehen, was den Namen und Pfad der Datei zu erstellen versucht, um sicherzustellen, dass die Eltern sind auch ein Verzeichnis.

Darüber hinaus können Sie auch einen Blick auf Kanäle nehmen, statt eine Schleife zu verwenden. ; -)

Sie sagen, „für einige Benutzer“ - so funktioniert es für andere? Was ist der Unterschied hier werden die Benutzer, die verschiedenen Instanzen auf verschiedenen Rechnern, oder ist dies ein Server, der gleichzeitig angemeldeten Benutzer-Dienste?

Wenn letzteres, ich würde sagen, es ist ein Concurrency Fehler ist irgendwie -. Zwei Threads überprüfen versuchen, die Datei mit WinNTFileSystem.createFileExclusively (native Methode) simultaniously erstellen

Weder CreateNewFile oder createFileExclusively werden synchronisiert, wenn ich an der OpenJDK Quelle aussehen, so dass Sie diese Texte selbst blockieren synchronisieren müssen können.

Vielleicht die Datei bereits vorhanden ist. Es könnte der Fall sein, wenn Ihr Zeitstempel Auflösung nicht gut genug ist. Da es ein IOException ist, dass Sie bekommen, könnte es nicht eine Erlaubnis Problem sein (in diesem Fall, dass Sie eine Security bekommen würden).

würde ich zum ersten Mal für die Datei Existenz überprüfen, bevor Sie die Datei erstellen und versuchen, zu protokollieren, was passiert.

Lesen Sie public boolean CreateNewFile () für weitere Informationen über die Methode, die Sie verwenden.

Wie ich war nicht in der Lage der Fehler auf meinem eigenen Rechner zu reproduzieren oder die Hände auf der Maschine des Benutzers, wo der Code scheiterte ich erst jetzt eine akzeptierte Antwort zu erklären. Ich änderte den Code wie folgt:

File parentFolder = new File(targetPath);
... do some checks on parentFolder here ...
File targetFile = new File(parentFolder, 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);
}

Danach ist es für den Anwender berichtet das Problem gearbeitet.

Es scheint also Alexanders Antwort der Trick -. Obwohl ich einen etwas anderen Konstruktor tatsächlich als er gab, aber auf der gleichen Linie

Ich muss noch, dass die Benutzer sprechen in mir zu überprüfen helfen, dass der Codeänderung der Fehler behoben (statt ihm etwas anders zu machen), indem Sie die alte Version wieder zu laufen und prüfen, ob es immer noch nicht.

btw. Protokollierung war an Ort und Stelle und der protokollierte Weg schien in Ordnung - sorry für das nicht zu erwähnen. Ich nahm das als selbstverständlich und fand es unnötig, den Code in der Frage kompliziert.

Danke für die hilfreichen Antworten.

Ein sehr ähnlicher Fehler: -  „... java.io.IOException: Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch“ in Eclipse erzeugt für mich war, wenn die Haupteinstellung TOMCAT ein Training Backslash hatte.

Die Kleine Änderung vorgeschlagen bei: -   http://www.coderanch.com/t/556633 / Tomcat / java-io-IOException-Dateiname-Verzeichnis regelte es für mich.

Entfernen Sie alle Sonderzeichen in den Datei / Ordner-Namen in dem vollständigen Pfad.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top