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”
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.
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.