¿Cuáles son los posibles motivos de la excepción java.io.IOException: & # 8220; La sintaxis de nombre de archivo, nombre de directorio o etiqueta de volumen es incorrecta & # 8221;

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Estoy intentando copiar un archivo con el siguiente código:

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

Para algunos usuarios, el targetFile.createNewFile da como resultado esta excepción:

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)

El nombre de archivo y el nombre del directorio parecen ser correctos. El directorio targetPath incluso se verifica antes de que se ejecute el código de copia y el nombre del archivo se vea así: AB_timestamp.xml

El usuario tiene permisos de escritura en targetPath y puede copiar el archivo sin problemas usando el sistema operativo.

Como todavía no tengo acceso a una máquina, esto no ocurre todavía y no puedo reproducir el problema en mi propia máquina. Me dirijo a usted para obtener sugerencias sobre el motivo de esta excepción.

¿Fue útil?

Solución

Intente esto, ya que se preocupa más por ajustar los caracteres separadores de directorios en la ruta entre targetPath y filename:

File targetFile = new File(targetPath, filename);

Otros consejos

Acabo de encontrar el mismo problema. Creo que tiene que ver con el permiso de acceso de escritura. Recibí el error al intentar escribir en c: \ pero al cambiar a D: \ todo funcionó bien. Al parecer, Java no tenía permiso para escribir en mi unidad del sistema (ejecutando Windows 7 instalado en C :)

Para tu información, obtuve entonces cuando mis nombres de archivo tenían una marca de tiempo con dos puntos, es decir, myfile_HH: mm: ss.csv La eliminación de dos puntos solucionó el problema.

Aquí está el programa de prueba que 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();
        }
    }
}

Intente crear el archivo en un directorio diferente, por ejemplo, " C: \ " después de asegurarse de que tiene acceso de escritura a ese directorio. Si eso funciona, el nombre de la ruta del archivo es incorrecto.

Eche un vistazo al comentario en la Excepción e intente variar todos los elementos en el nombre de la ruta del archivo. Experimentar. Sacar conclusiones.

¿Comprueba que targetPath es un directorio, o simplemente que algo existe con ese nombre? (Sé que usted dice que el usuario puede copiarlo desde el sistema operativo, pero tal vez estén escribiendo otra cosa).

¿TargetPath termina con un File.separator ya?

(Le ayudaría si pudiera iniciar sesión y decirnos cuál es el valor de targetPath y nombre de archivo en un caso de falla)

¿Quizás el problema es que está copiando el archivo a través de la red a una unidad compartida? Creo que Java puede tener problemas al escribir archivos utilizando NFS cuando la ruta es algo así como la carpeta \ mypc \ myshared.

¿Cuál es la ruta donde ocurre este problema?

Intente agregar algo de registro para ver exactamente cuál es el nombre y la ruta que el archivo está tratando de crear, para asegurarse de que el padre sea un directorio.

Además, también puedes echar un vistazo a los canales en lugar de usar un bucle. ;-)

Dices " para algunos usuarios " - ¿Así funciona para otros? ¿Cuál es la diferencia aquí, son los usuarios ejecutando diferentes instancias en diferentes máquinas o es este un servidor que atiende a los usuarios concurrentes?

Si es lo último, diría que es un error de concurrencia de alguna manera: dos subprocesos comprueban el intento de crear el archivo con WinNTFileSystem.createFileExclusively (método nativo) simultáneamente.

Ni createNewFile ni createFileExclusively están sincronizados cuando veo la fuente de OpenJDK, por lo que es posible que tenga que sincronizar este bloque.

Tal vez el archivo ya existe. Podría ser el caso si la resolución de su marca de tiempo no es lo suficientemente buena. Como es una IOException que está recibiendo, es posible que no sea un problema de permisos (en cuyo caso obtendría una SecurityException).

Primero verificaría la existencia del archivo antes de intentar crear el archivo e intentar registrar lo que está sucediendo.

Mire booleano público createNewFile () para obtener más información sobre el método que está utilizando.

Como no pude reproducir el error en mi propia máquina ni hacer uso de la máquina del usuario donde el código falló, esperé hasta ahora para declarar una respuesta aceptada. Cambié el código a lo siguiente:

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

Después de eso, funcionó para el usuario que reportó el problema.

Parece que la respuesta de Alexanders hizo el truco, aunque en realidad uso un constructor ligeramente diferente al que él dio, pero en la misma línea.

Todavía tengo que convencer al usuario para que me ayude a verificar que el cambio de código corrigió el error (en lugar de que él haga algo diferente) ejecutando la versión anterior de nuevo y comprobando si sigue fallando.

por cierto. el registro estaba en su lugar y la ruta registrada parecía estar bien, lo siento por no mencionar eso. Lo di por sentado y lo encontré innecesariamente complicado el código en la pregunta.

Gracias por las respuestas útiles.

Un error muy similar: -  " ... java.io.IOException: la sintaxis de nombre de archivo, nombre de directorio o etiqueta de volumen es incorrecta " se generó en Eclipse para mí cuando la configuración de inicio de TOMCAT tuvo una barra invertida de entrenamiento.

La edición menor sugerida en: -   http://www.coderanch.com/t/556633 / Tomcat / java-io-IOException-filename-directory lo arregla para mi

Elimine cualquier carácter especial en el nombre del archivo / carpeta en la ruta completa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top