Quelles sont les raisons possibles de java.io.IOException: "La syntaxe du nom de fichier, du nom de répertoire ou de l'étiquette de volume est incorrecte"
Je suis en train de copier un fichier en utilisant le code suivant:
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);
}
Pour certains utilisateurs, la targetFile.createNewFile
résultats de cette exception:
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)
Nom de fichier et le nom du répertoire semblent corrects. Le répertoire targetPath
est encore vérifié l'existence avant de la copier le code est exécuté et le nom de fichier ressemble à ceci: AB_timestamp.xml
L'utilisateur a des droits d'écriture pour le targetPath
et pouvez copier le fichier sans problèmes à l'aide de l'OS.
Que je n'ai pas accès à une machine ce qui se passe sur la encore et ne peut pas reproduire le problème sur ma machine, je me tourne vers vous pour des conseils sur la raison de cette exception.
source d'informationauteur Turismo
Vous devez vous connecter pour publier un commentaire.
Essayer cela, il prend plus de soin de réglage de séparateur de répertoire de caractères dans le chemin d'accès entre targetPath et nom de fichier:
Je viens de rencontré le même problème. Je pense qu'il a quelque chose à voir avec écrire une autorisation d'accès. J'ai obtenu l'erreur en essayant d'écrire sur c:\, mais elle change de D:\ tout a bien fonctionné.
Apparemment, Java n'a pas l'autorisation d'écrire à mon Disque Système (Windows 7 installé sur C:)
Voici le programme de test j'utilise
Essayer de créer le fichier dans un répertoire différent - par exemple "C:\" une fois que vous assurez que vous avez accès en écriture sur ce répertoire. Si cela fonctionne, le nom du chemin d'accès du fichier est incorrect.
Regardez le commentaire de l'Exception et essayez de varier tous les éléments dans le nom du chemin d'accès du fichier. Expérience. Tirer des conclusions.
Pour info, j'ai eu ma les noms de fichiers a un timestamp avec des points, c'est à dire
myfile_HH:mm:ss.csv
Retrait de deux points fixes de la question.Vérifiez-vous que les targetPath est un répertoire, ou tout simplement que quelque chose existe avec ce nom? (Je sais que vous dire que l'utilisateur peut copier à partir du système d'exploitation, mais peut-être qu'ils en train de taper quelque chose d'autre).
Ne targetPath fin avec un Fichier.séparateur déjà?
(Il serait utile si vous pouviez journal et dites-nous ce que la valeur de targetPath et le nom de fichier sont sur un cas d'échec)
Peut-être le problème, c'est qu'il s'agit de copier le fichier sur le réseau, un lecteur partagé? Je pense que java peut y avoir des problèmes lors de l'écriture de fichiers à l'aide de NFS lorsque le chemin est quelque chose comme \mypc\myshared dossier.
Qu'est-ce que le chemin d'accès où ce problème se produit?
Essayer d'ajouter un peu de journalisation pour voir exactement quel est le nom et le chemin d'accès du fichier est d'essayer de créer, de s'assurer que le parent est bien un répertoire.
En outre, vous pouvez également jeter un oeil à des Canaux au lieu d'utiliser une boucle. 😉
Vous dites "pour certains utilisateurs" - de sorte qu'il fonctionne pour les autres? Quelle est la différence ici, ce sont les utilisateurs qui exécutent différentes instances sur des machines différentes, ou est-ce un serveur de services utilisateurs simultanés?
Si la dernière question, je dirais que c'est un simultanéité bug en quelque sorte - deux fils vérifiez essayer de créer un fichier avec WinNTFileSystem.createFileExclusively(Native method) simultanément.
Ni createNewFile ou createFileExclusively sont synchronisés lorsque je regarde la OpenJDK source, donc vous pouvez avoir à synchroniser ce bloc vous-même.
Peut-être que le fichier existe déjà. Ce pourrait être le cas si votre résolution d'horodatage n'est pas assez bon. Comme c'est une IOException que vous obtenez, il pourrait ne pas être un problème de permission (dans ce cas, vous obtiendrez une SecurityException).
Je voudrais d'abord vérifier d'existence du fichier avant d'essayer de créer le fichier et essayez de vous ce qui se passe.
Regarder public boolean createNewFile() pour plus d'informations sur la méthode que vous utilisez.
Que je n'étais pas en mesure de reproduire l'erreur sur ma propre machine, ou mettre la main sur la machine de l'utilisateur, le code a échoué, j'ai attendu jusqu'à maintenant pour déclarer accepté de répondre.
J'ai changé le code de la manière suivante:
Après cela, il a travaillé pour l'utilisateur de signaler le problème.
Il semble donc Alexanders répondre a fait le tour - bien fait, j'ai un peu différent constructeur qu'il a donné, mais dans le même sens.
J'ai encore à parler que de l'utilisateur en m'aidant de vérifier que le changement de code de correction de l'erreur (au lieu de lui faire quelque chose différemment) en exécutant l'ancienne version de nouveau et vérifier si elle échoue encore.
btw. l'enregistrement est en place et le chemin d'accès connecté semblait ok - désolé de ne pas mentionner que. J'ai pris cela pour acquis et il a trouvé inutilement compliqué le code en question.
Merci pour les réponses utiles.
Une très similaires d'erreur:-
"... java.io.IOException: Le nom de fichier, le nom du répertoire ou de la syntaxe du nom de volume est incorrecte"
a été généré dans Eclipse pour moi, quand le TOMCAT maison avait une barre oblique inverse.
La modification mineure a été suggéré à:-
http://www.coderanch.com/t/556633/Tomcat/java-io-IOException-filename-directory
il fixe pour moi.