Quelles sont les raisons possibles pour java.io.IOException: & # 8220; La syntaxe du nom de fichier, du nom de répertoire ou du libellé de volume est incorrecte & # 8221;

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

  •  02-07-2019
  •  | 
  •  

Question

J'essaie de copier un fichier à l'aide du 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, le targetFile.createNewFile entraîne 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)

Le nom de fichier et le nom du répertoire semblent être corrects. L'existence du répertoire targetPath est même vérifiée avant l'exécution du code de copie et le nom du fichier se présente comme suit: AB_timestamp.xml

L'utilisateur dispose d'autorisations en écriture sur targetPath et peut copier le fichier sans problème avec le système d'exploitation.

Comme je n'ai pas accès à une machine, cela se produit encore et je ne peux pas reproduire le problème sur ma propre machine, je me tourne vers vous pour obtenir des conseils sur la raison de cette exception.

Était-ce utile?

La solution

Essayez ceci, car il faut plus de soin pour ajuster les caractères de séparation de répertoire dans le chemin entre targetPath et le nom du fichier:

File targetFile = new File(targetPath, filename);

Autres conseils

Je viens de rencontrer le même problème. Je pense que cela doit faire quelque chose avec la permission d'accès en écriture. J'ai eu l'erreur en essayant d'écrire sur c: \ mais en passant à D: \ tout a bien fonctionné. Apparemment, Java n’avait pas l’autorisation d’écrire sur mon lecteur système (Windows 7 installé sous C:)

Pour info, j'ai eu quand mon nom de fichier avait un horodatage avec les deux points, c'est-à-dire mon_fichier_HH: mm: ss.csv La suppression des deux points a résolu le problème.

Voici le programme de test que j'utilise

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

Essayez de créer le fichier dans un autre répertoire - par exemple. " C: \ " après vous être assuré que vous avez un accès en écriture à ce répertoire. Si cela fonctionne, le chemin du fichier est incorrect.

Examinez le commentaire dans l'exception et essayez de faire varier tous les éléments du chemin d'accès du fichier. Expérience. Tirer des conclusions.

Vérifiez-vous que le targetPath est un répertoire ou juste que quelque chose existe avec ce nom? (Je sais que vous dites que l'utilisateur peut le copier à partir du système d'exploitation, mais peut-être est-il en train de taper autre chose).

targetPath se termine-t-il déjà avec File.separator?

(Cela vous aiderait si vous pouviez vous connecter et nous dire quelle est la valeur de targetPath et de nom de fichier sur un cas qui échoue)

Peut-être que le problème est qu’il copie le fichier sur le réseau, sur un lecteur partagé? Je pense que java peut avoir des problèmes lors de l’écriture de fichiers avec NFS lorsque le chemin est quelque chose comme \ mypc \ myshared folder.

Quel est le chemin où ce problème se produit?

Essayez d’ajouter de la journalisation pour voir exactement quel est le nom et le chemin que le fichier tente de créer, afin de vous assurer que le parent est bien un répertoire.

En outre, vous pouvez également consulter Chaînes au lieu d’utiliser une boucle. ; -)

Vous dites "pour certains utilisateurs". - ça marche pour les autres? Quelle est la différence ici, les utilisateurs exécutent-ils des instances différentes sur des machines différentes ou s'agit-il d'un serveur qui dessert des utilisateurs simultanés?

Dans ce dernier cas, je dirais que c'est un bogue d'accès simultané - deux threads vérifient la création simultanée du fichier avec WinNTFileSystem.createFileExclusively (méthode native).

Ni createNewFile ni createFileExclusively ne sont synchronisés lorsque j'examine le code source OpenJDK. Vous devrez donc peut-être synchroniser ce bloc vous-même.

Peut-être que le fichier existe déjà. Ce pourrait être le cas si la résolution de votre horodatage n'est pas suffisante. Comme il s'agit d'une exception IOException, il se peut que le problème ne soit pas une autorisation (auquel cas vous obtiendriez une SecurityException).

Je voudrais d'abord vérifier l'existence d'un fichier avant d'essayer de le créer et d'essayer de consigner ce qui se passe.

Regardez public boolean createNewFile () pour plus d'informations sur la méthode utilisée.

Comme je ne pouvais pas reproduire l'erreur sur ma propre machine ni mettre la main sur la machine de l'utilisateur là où le code avait échoué, j'ai attendu jusqu'à maintenant pour déclarer une réponse acceptée. J'ai changé le code comme suit:

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);
}

Ensuite, cela a fonctionné pour l'utilisateur signalant le problème.

Il semble donc que la réponse d’Alexandre ait été efficace - bien que j’utilise un constructeur légèrement différent de celui qu’il a proposé, mais dans le même sens.

Je dois encore convaincre cet utilisateur de m'aider à vérifier que le changement de code a corrigé l'erreur (au lieu de le faire différemment) en exécutant à nouveau l'ancienne version et en vérifiant si elle échoue toujours.

btw. la journalisation était en place et le chemin d'accès semblait correct - désolé de ne pas l'avoir mentionné. J'ai pris cela pour acquis et j'ai trouvé que cela compliquait inutilement le code dans la question.

Merci pour les réponses utiles.

Une erreur très similaire: -  " ... java.io.IOException: le nom du fichier, le nom du répertoire ou le libellé du libellé de volume est incorrect " a été généré dans Eclipse pour moi lorsque la configuration de base de TOMCAT a été inversée.

La modification mineure suggérée à: -   http://www.coderanch.com/t/556633 / Tomcat / java-io-IOException-filename-directory corrigé pour moi.

Supprimez tous les caractères spéciaux du nom du fichier / dossier dans le chemin complet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top