Quali sono le possibili ragioni di java.io.IOException: "La sintassi del nome file, del nome della directory o dell'etichetta del volume non è corretta"

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

  •  02-07-2019
  •  | 
  •  

Domanda

Sto provando a copiare un file usando il seguente codice:

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

Per alcuni utenti il ?? targetFile.createNewFile risulta in questa eccezione:

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)

Il nome file e il nome della directory sembrano essere corretti. La directory targetPath viene persino verificata per l'esistenza prima dell'esecuzione del codice di copia e il nome del file è simile al seguente: AB_timestamp.xml

L'utente dispone delle autorizzazioni di scrittura per targetPath e può copiare il file senza problemi utilizzando il sistema operativo.

Poiché non ho ancora accesso a una macchina, ciò accade ancora e non riesco a riprodurre il problema sulla mia macchina, mi rivolgo a te per suggerimenti sul motivo di questa eccezione.

È stato utile?

Soluzione

Prova questo, poiché si occupa maggiormente della regolazione dei caratteri del separatore di directory nel percorso tra targetPath e nome file:

File targetFile = new File(targetPath, filename);

Altri suggerimenti

Ho appena riscontrato lo stesso problema. Penso che abbia a che fare con il permesso di accesso in scrittura. Ho riscontrato l'errore durante il tentativo di scrivere in c: \ ma cambiando in D: \ tutto ha funzionato bene. Apparentemente Java non aveva il permesso di scrivere sul mio System Drive (con Windows 7 installato su C :)

Cordiali saluti, ho avuto quando i miei nomi di file avevano un timestamp con due punti, cioè myfile_HH: mm: ss.csv La rimozione dei due punti ha risolto il problema.

Ecco il programma di test che uso

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

Prova a creare il file in una directory diversa, ad es. & Quot; C: \ " dopo esserti assicurato di avere accesso in scrittura a quella directory. Se funziona, il nome del percorso del file è errato.

Dai un'occhiata al commento nell'eccezione e prova a variare tutti gli elementi nel nome del percorso del file. Sperimentare. Trarre conclusioni.

Verifichi che targetPath sia una directory o che esista qualcosa con quel nome? (So ??che dici che l'utente può copiarlo dal sistema operativo, ma forse stanno scrivendo qualcos'altro).

targetPath termina già con un File.separator?

(Sarebbe di aiuto se tu potessi registrarti e dirci quali sono i valori di targetPath e nome file su un caso non riuscito)

Forse il problema è che sta copiando il file sulla rete, su un'unità condivisa? Penso che Java possa avere problemi durante la scrittura di file utilizzando NFS quando il percorso è qualcosa come la cartella \ mypc \ myshared.

Qual è il percorso in cui si verifica questo problema?

Prova ad aggiungere alcune registrazioni per vedere esattamente qual è il nome e il percorso che il file sta cercando di creare, per assicurarti che il genitore sia una directory.

Inoltre, puoi anche dare un'occhiata a Canali invece di usare un loop. ; -)

Dici " per alcuni utenti " - quindi funziona per gli altri? Qual è la differenza qui, gli utenti eseguono istanze diverse su macchine diverse o si tratta di un server che serve utenti simultanei?

Se in quest'ultimo caso, direi che è in qualche modo un bug di concorrenza: due thread controllano il tentativo di creare il file con WinNTFileSystem.createFileExclusively (metodo nativo) simultaneamente.

Né createNewFile o createFileExclusively sono sincronizzati quando guardo l'origine OpenJDK, quindi potrebbe essere necessario sincronizzare questo blocco da soli.

Forse il file esiste già. Potrebbe essere il caso se la risoluzione del timestamp non è abbastanza buona. Poiché si tratta di una IOException che si sta ottenendo, potrebbe non essere un problema di autorizzazione (nel qual caso si otterrebbe una SecurityException).

Vorrei prima verificare l'esistenza del file prima di provare a creare il file e provare a registrare ciò che sta accadendo.

Guarda booleano pubblico createNewFile () per ulteriori informazioni sul metodo che stai utilizzando.

Dato che non ero in grado di riprodurre l'errore sulla mia macchina o di mettere le mani sulla macchina dell'utente in cui il codice falliva, ho aspettato fino ad ora per dichiarare una risposta accettata. Ho modificato il codice nel seguente:

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

Successivamente ha funzionato per l'utente che ha segnalato il problema.

Quindi sembra che la risposta di Alexanders abbia funzionato, anche se in realtà uso un costruttore leggermente diverso da quello che ha dato, ma sulla stessa linea.

Devo ancora convincere quell'utente ad aiutarmi a verificare che la modifica del codice abbia corretto l'errore (invece di fare qualcosa in modo diverso) eseguendo di nuovo la vecchia versione e verificando se continua a fallire.

btw. la registrazione era a posto e il percorso registrato sembrava ok - scusatemi per non averlo menzionato. L'ho dato per scontato e ho trovato inutilmente complicato il codice nella domanda.

Grazie per le risposte utili.

Un errore molto simile: -  & Quot; ... java.io.IOException: la sintassi del nome file, del nome della directory o dell'etichetta del volume non è corretta " è stato generato in Eclipse per me quando l'impostazione della casa TOMCAT ha avuto una barra rovesciata di allenamento.

La modifica minore suggerita su: -   http://www.coderanch.com/t/556633 / Tomcat / java-io-IOException-filename-directory riparato per me.

Rimuovi tutti i caratteri speciali nel nome del file / cartella nel percorso completo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top