무엇인가에 대한 가능한 이유는 java.io.IOException:"파일,디렉토리의 이름 또는 볼륨 레이블 문법이 올바르지 않습니다"

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

  •  02-07-2019
  •  | 
  •  

문제

내가 노력하고를 복사본을 사용하여 파일을 다음과 같은 코드:

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

에 대한 몇 가지 사용자 targetFile.createNewFile 결과에서 이러한 예외:

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)

파일명과 디렉터리에 이름을 보이 정확해야 합니다.디렉토리 targetPath 도 확인을 위해 존재하기 전에 사본 코드는 실행 파일 다음과 같습니다: AB_timestamp.xml

사용자가에 쓰기 권한 targetPath 고 복사하지 않고 파일을 사용하여 문제를 OS.

로 액세스할 수 없는 기계에 이런 아직과를 재현할 수 없습 문제에서 자신의 컴퓨터가 당신에 대한 힌트는 이유에 대한 이 예외는 아니다.

도움이 되었습니까?

해결책

TargetPath와 Filename 사이의 경로에서 디렉토리 분리기 문자 조정을 더 많이 관리하므로 다음과 같이 시도하십시오.

File targetFile = new File(targetPath, filename);

다른 팁

방금 같은 문제가 발생했습니다. 나는 그것이 쓰기 액세스 권한과 관련이 있다고 생각합니다. C : 에 편지를 쓰려고하는 동안 오류가 발생했지만 d : 모든 것이 잘 작동했습니다. 분명히 Java는 내 시스템 드라이브에 쓸 수있는 권한이 없었습니다 (C에 설치된 Windows 7 실행 :)

참고로, 나는 내 파일 이름이 콜론과 타임 스탬프를 가졌을 때 얻었습니다. myfile_HH:mm:ss.csv 콜론을 제거하면 문제가 해결되었습니다.

다음은 내가 사용하는 테스트 프로그램입니다

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

를 만들려고 하는 파일에서 다른 디렉터리-예를 들어,"C:\"한 후에 당신은 확신에 쓰기 권한이 있는 디렉토리에 있습니다.작동하는 경우,경로는 파일의 이름은 잘못된 것입니다.

을 살펴에 댓글을 제외하고 변화하는 모든 요소에서의 경로 파일의 이름입니다.실험입니다.는 결론을 그립니다.

TargetPath가 디렉토리인지 또는 그 이름에 무언가가 존재하는지 확인합니까? (사용자가 운영 체제에서 복사 할 수 있다고 말하지만 다른 것을 입력하고있을 수도 있습니다).

TargetPath가 File.Separator로 이미 끝나나요?

(로그인하고 TargetPath와 Filename의 가치가 실패한 경우에 무엇이 있는지 알려줄 수 있다면 도움이 될 것입니다).

문제는 네트워크를 통해 파일을 공유 드라이브로 복사한다는 것입니다. 경로가 mypc myshared 폴더와 같은 경우 NFS를 사용하여 파일을 작성할 때 Java가 문제가있을 수 있다고 생각합니다.

이 문제가 발생하는 경로는 무엇입니까?

부모가 잘 디렉토리인지 확인하기 위해 파일이 작성하려는 이름과 경로를 정확히 확인하기 위해 로깅을 추가해보십시오.

또한 루프를 사용하는 대신 채널을 살펴볼 수도 있습니다. ;-)

당신은 "일부 사용자를 위해"라고 말합니다. 그래서 다른 사람들에게 효과가 있습니까? 여기서 차이점은 무엇입니까? 사용자가 다른 시스템에서 다른 인스턴스를 실행하는 사용자는 동시 사용자에게 서비스를 제공하는 서버입니까?

후자라면, 그것이 어떻게 든 동시성 버그라고 말할 것입니다 - 두 스레드 점검은 winntfilesystem.createfileexclusclively (기본 메소드)로 파일을 만들려고합니다.

OpenJDK 소스를 볼 때 CreateNewFile 또는 CreateFileExclusially가 동기화되지 않으므로이 블록을 직접 동기화해야 할 수도 있습니다.

아마도 파일이 이미 존재할 수도 있습니다. 타임 스탬프 해상도가 충분하지 않은 경우에 해당 될 수 있습니다. 당신이 얻는 IoException이기 때문에 권한 문제가 아닐 수도 있습니다 (즉, 보안 소집을 얻을 수 있음).

파일을 만들기 전에 파일 존재를 먼저 확인하고 일어나는 일을 기록하려고합니다.

보다 공개 부울 CreateNewFile () 사용중인 방법에 대한 자세한 내용은

내 컴퓨터에서 오류를 재현하거나 코드가 실패한 사용자의 기계에 손을 잡을 수 없었기 때문에 지금까지 허용 된 답변을 선언하기를 기다렸습니다. 코드를 다음으로 변경했습니다.

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

그 후 문제를보고하는 사용자를 위해 일했습니다.

그래서 Alexanders Answer는 트릭을 수행 한 것 같습니다. 비록 실제로 그가 준 것과 약간 다른 생성자를 사용하지만 같은 선을 따라 사용합니다.

아직 해당 사용자에게 코드 변경이 이전 버전을 다시 실행하고 여전히 실패하는지 확인하여 오류를 다르게 수행하는 대신 오류를 고정했는지 확인하도록 도와야합니다.

BTW. 벌목이 제자리에 있었고 기록 된 경로는 괜찮아 보였습니다. 언급하지 않아서 죄송합니다. 나는 그것을 당연한 것으로 받아들이고 문제의 코드를 불필요하게 복잡하게 발견했다.

도움이되는 답변에 감사드립니다.

매우 유사한 오류 :- "... java.io.ioexception : filename, 디렉토리 이름 또는 볼륨 레이블 구문이 올바르지 않았습니다.

마이너 편집은 다음과 같이 제안됩니다. http://www.coderanch.com/t/556633/tomcat/java-io-ioexception-filename-directory나를 위해 그것을 고쳤습니다.

전체 경로에서 파일/폴더 이름의 특수 문자를 제거하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top