2008-09-25 14 views
11

Ich versuche, eine Datei mit dem folgenden Code zu kopieren:Was sind mögliche Gründe für java.io.IOException: „Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch“

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) 

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 muss die targetPath Berechtigungen schreiben und die Datei ohne Probleme mit dem O kopieren.

Da ich keinen Zugriff auf eine Maschine habe, passiert dies noch und kann das Problem nicht auf meiner eigenen Maschine reproduzieren. Ich wende mich an Sie, um Hinweise auf den Grund für diese Ausnahme zu erhalten.

Antwort

5

die Sie interessieren, da es mehr Pflege von Verzeichnistrennzeichen Einstellung auf dem Weg zwischen targetPath und Dateinamen nimmt:

File targetFile = new File(targetPath, filename); 
0

Überprüfen Sie, ob der targetPath ein Verzeichnis ist oder ob nur etwas mit diesem Namen existiert? (Ich weiß, Sie sagen, der Benutzer kann es vom Betriebssystem kopieren, aber vielleicht tippen sie etwas anderes).

Wird targetPath bereits mit einem File.separator beendet?

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

0

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

In welchem ​​Pfad tritt dieses Problem auf?

0

Versuchen Sie, eine Protokollierung hinzuzufügen, um genau zu sehen, welchen Namen und welchen Pfad die Datei zu erstellen versucht, um sicherzustellen, dass das übergeordnete Verzeichnis ein Verzeichnis ist.

Außerdem können Sie sich Kanäle ansehen, anstatt eine Schleife zu verwenden. ;-)

0

Sie sagen "für einige Benutzer" - so funktioniert es für andere? Was ist der Unterschied hier, sind die Benutzer, die unterschiedliche Instanzen auf verschiedenen Computern ausführen, oder handelt es sich um einen Server, der gleichzeitige Benutzer bedient?

Wenn letzteres, würde ich sagen, es ist ein Nebenläufigkeitsfehler irgendwie - zwei Threads überprüfen versuchen, die Datei mit WinNTFileSystem.createFileExclusively (Native Method) gleichzeitig zu erstellen.

Weder createNewFile noch createFileExclusively werden synchronisiert, wenn ich die OpenJDK-Quelle anschaue, daher müssen Sie diesen Block möglicherweise selbst synchronisieren.

1

Versuchen Sie, die Datei in einem anderen Verzeichnis zu erstellen - z. "C: \", nachdem Sie sichergestellt haben, dass Sie Schreibzugriff auf dieses Verzeichnis haben. Wenn das funktioniert, ist der Pfadname der Datei falsch.

Sehen Sie sich den Kommentar in der Exception an und versuchen Sie, alle Elemente im Pfadnamen der Datei zu variieren. Experiment. Schlussfolgerungen.

0

Vielleicht existiert die Datei bereits. Es könnte der Fall sein, wenn Ihre Zeitstempelauflösung nicht gut genug ist. Da es sich um eine IOException handelt, die Sie erhalten, handelt es sich möglicherweise nicht um ein Berechtigungsproblem (in diesem Fall würden Sie eine SecurityException erhalten).

Ich würde zuerst nach Datei Existenz suchen, bevor Sie versuchen, die Datei zu erstellen und versuchen, zu protokollieren, was passiert.

Schauen Sie sich public boolean createNewFile() für weitere Informationen über die Methode an, die Sie verwenden.

+0

Die API sagt eigentlich, dass es keine IOException auslösen wird, wenn die Datei bereits existiert, aber in diesem Fall einfach false zurückgibt. – Turismo

0

Da ich nicht in der Lage war, den Fehler auf meiner eigenen Maschine zu reproduzieren oder sie die Hände auf dem Computer des Benutzers, bei dem der Code fehlgeschlagen ist, habe ich bis jetzt gewartet, um 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 Benutzer bearbeitet das Problem berichten.

So scheint es Alexanders Antwort hat den Trick - obwohl ich tatsächlich einen etwas anderen Konstruktor als er gab, aber in die gleiche Richtung.

Ich muss diesen Benutzer noch dazu überreden, mir zu bestätigen, dass die Codeänderung den Fehler behoben hat (anstatt dass er etwas anders macht), indem er die alte Version erneut ausführt und prüft, ob sie immer noch fehlschlägt.

btw. Logging war vorhanden und der geloggte Pfad schien in Ordnung - tut mir leid, dass ich das nicht erwähnt habe. Ich nahm das für selbstverständlich und fand es unnötig kompliziert den Code in der Frage.

Danke für die hilfreichen Antworten.

3

Ich habe gerade das gleiche Problem festgestellt. Ich denke es hat etwas mit Schreibzugriff zu tun. Ich habe den Fehler bekommen, während ich versucht habe, in c: \ zu schreiben, aber nach dem Wechsel zu D: \ alles hat gut funktioniert. Offenbar Java hat nicht die Erlaubnis, mein System Drive (Ausführen von Windows 7 installierte auf C zu schreiben :)

+0

Einverstanden. Ich habe den gleichen Fehler bekommen, wenn ich auf eine Datei unter C: \ Benutzer \ Benutzer \ Desktop ... verwiesen habe, aber wenn die Datei nach C: \ temp verschoben wurde, wurde das Problem gelöst, also kann es mit der Berechtigung zu Problemen kommen. – Imre

3

Hier ist das Testprogramm I

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(); 
     } 
    } 
} 
+0

Sie sollten eine neue Frage für Ihr Problem öffnen, wenn das Durcharbeiten der Antworten zu dieser Frage Ihnen nicht hilft. Es ist unwahrscheinlich, dass Sie eine Antwort erhalten, wenn Sie Ihre Frage als Antwort auf diese Frage stellen. – Turismo

1

FYI, ich bekam dann, wenn meine Dateinamen einen Zeitstempel mit Doppelpunkten hatten, dh myfile_HH:mm:ss.csv Das Entfernen von Doppelpunkten behob das Problem.