Quais são as possíveis razões para java.io.IOException: “O nome do arquivo, nome do diretório ou sintaxe de rótulo de volume está incorreta”

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando copiar um arquivo usando o seguinte 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 alguns usuários os resultados targetFile.createNewFile neste exceção:

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)

Nome do arquivo eo nome do diretório parecem ser correta. O targetPath diretório é mesmo verificado para a existência antes do código de cópia é executado e os olhares de nome de arquivo como este: AB_timestamp.xml

O usuário tem permissões de gravação para o targetPath e pode copiar o arquivo sem problemas usando o OS.

Enquanto eu não tiver acesso a uma máquina de isso acontecer em ainda e não pode reproduzir o problema em minha própria máquina eu volto para você para dicas sobre a razão para essa exceção.

Foi útil?

Solução

Tente este, como é preciso mais cuidado de ajustar caracteres separadores de diretório no caminho entre targetPath e filename:

File targetFile = new File(targetPath, filename);

Outras dicas

Eu só encontrou o mesmo problema. Eu acho que tem algo fazer com permissão de acesso de gravação. Eu tenho o erro ao tentar escrever para c: \ mas em mudar para D: \ tudo funcionou bem. Aparentemente Java não tem permissão para escrever para o meu sistema de transmissão (com o Windows 7 instalado em C:)

FYI, eu tenho, então quando meus nomes de arquivos tinha um timestamp com dois pontos, ou seja myfile_HH:mm:ss.csv dois pontos Remoção corrigiu o problema.

Aqui está o uso do programa de teste 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();
        }
    }
}

Tente criar o arquivo em um diretório diferente - por exemplo, "C: \" depois de ter feito se você tem acesso de gravação para esse diretório. Se isso funcionar, o nome do caminho do arquivo está errado.

Dê uma olhada no comentário na exceção e tente variar todos os elementos no nome do caminho do arquivo. Experimentar. Tirar conclusões.

Você verificar que o targetPath é um diretório, ou apenas que algo existe com esse nome? (Eu sei que você diz que o usuário pode copiá-lo a partir do sistema operacional, mas talvez eles está digitando algo mais).

end Does targetPath com um File.separator já?

(Seria bom se você pode logar e diga-nos qual é o valor de targetPath e nome do arquivo estão em um caso falha)

Talvez o problema é que ele está copiando o arquivo através da rede, para uma unidade compartilhada? Acho java podem ter problemas ao gravar arquivos usando NFS quando o caminho é algo como \ MyPC \ myshared pasta.

O que é o caminho onde este problema acontece?

Tente adicionar alguns logs para ver exatamente o que é o nome eo caminho do arquivo está tentando criar, para garantir que o pai é bem um diretório.

Além disso, você também pode dar uma olhada em canais, em vez de usar um loop. ; -)

Você diz que "para alguns usuários" - por isso funciona para os outros? Qual é a diferença aqui, são os usuários que executam diferentes instâncias em máquinas diferentes, ou isso é um servidor que serviços de usuários simultâneos?

Neste último caso, eu diria que é um erro de simultaneidade de alguma forma -. Dois tópicos verificar tentar criar o arquivo com WinNTFileSystem.createFileExclusively (Método Nativo) simultaniously

Nem CreateNewFile ou createFileExclusively são sincronizados quando eu olhar para a fonte OpenJDK, assim você pode ter que sincronizar este bloco si mesmo.

Talvez o arquivo já existe. Poderia ser o caso se a resolução do timestamp não é bom o suficiente. Como é um IOException que você está recebendo, ele pode não ser um problema de permissão (caso em que você teria um SecurityException).

Gostaria em primeiro lugar verificar a existência do arquivo antes de tentar criar o arquivo e tentar registrar o que está acontecendo.

CreateNewFile public boolean () para obter mais informações sobre o método que você está usando.

Como eu não era capaz de reproduzir o erro na minha própria máquina ou obter as mãos na máquina do usuário onde o código não esperei até agora para declarar uma resposta aceita. Mudei o código para o seguinte:

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

Depois que ele trabalhou para o usuário relatando o problema.

Assim, parece Alexanders resposta fez o truque -. Embora eu realmente usar um construtor ligeiramente diferente do que ele deu, mas ao longo das mesmas linhas

Eu ainda tenho que falar que o usuário para me ajudar a verificar se a alteração de código fixo o erro (em vez dele fazer algo diferente) executando a versão antiga novamente e verificar se ele ainda falha.

btw. logging estava no lugar eo caminho registrado parecia ok - desculpe por não mencionar isso. Tomei isso como garantido e achei desnecessariamente complicado o código em questão.

Obrigado pelas respostas úteis.

Um erro muito semelhante: - "... java.io.IOException: O nome do arquivo, nome do diretório ou sintaxe de rótulo de volume está incorreta" foi gerada em Eclipse para mim quando a configuração TOMCAT casa tinha uma barra invertida formação.

A edição menor sugeriu em: - http://www.coderanch.com/t/556633 / Tomcat / java-io-IOException-filename-diretório fixa-lo para mim.

Remova quaisquer caracteres especiais no nome do arquivo / pasta no caminho completo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top