2012-10-24 2 views
1

파일 또는 디렉토리의 이름을 바꾸는 Java 코드가 있습니다. Linux에서 일부 특수 문자를 사용하면 문제가 발생하며 Windows에서는 이러한 특수 문자로 작동합니다. 나는 그것을 시도하는 방법은 다음과 같이이다 :Java 파일 문자 인코딩 이동/이름 바꾸기 (Linux)

I라는 direcotory을 만들
  • 창에서 는 "326½_6는"

  • 내가 항아리 파일을 구축하고,에 직접 (자바 -jar)를 호출 Windows cmd (또는 Linux 쉘), 첫 번째 param은 위의 디렉토리이고 두 번째 param은 새 디렉토리의 경로입니다. 이

내가 다음 리눅스 서버 사용 SFTP (WinSCP에)에 디렉토리를 이전 작동합니다. 위의 단계를 반복하지만 작동하지 않습니다. -------

을 이름 변경을 수행 할 수 없습니다 ---

이동/홈/사용자/testarea/326�_6 /에/홈/사용자/testarea/test5/

:이 출력을 얻을

어쨌든이 작업을 리눅스 컴퓨터에서 할 수 있습니까 ???

코드 :

public static void main(String [] args) { 
    String source = args[0]; 
    String dest = args[1]; 
    System.out.println(" - Moving " + source + " to " + dest); 

    File sourceFile = new File(source); 
    File destinationFile = new File(dest); 

    if (!sourceFile.renameTo(destinationFile)) { 
     System.out.println("--- could not perform rename -------"); 
    } 

    System.out.println("Finished moving"); 
} 

감사합니다!

답변

2

Linux에서 Java 파일 및 디렉토리 이름이 UTF-8로 인코딩 될 것으로 예상되지만 WinSCP가 latin1 또는 이와 유사한 이름을 인코딩 할 때 새 이름이 인코딩되지 않습니다. UTF-8로 유효합니다. WinSCP의 기본 동작은 분명히 the newer versions use UTF-8 by default입니다.

Java에서 SFTP가 디렉토리를 만들 때 사용한 것과 동일한 인코딩을 사용하는 쉬운 솔루션입니다. 이는 JVM을 실행할 때 로케일을 변경하여 수행됩니다

LANG=en_US.iso8859_1 java -jar YourProgram.jar 

en_US.iso8859_1 일이 존재하는 로케일하지만. 배포판의 패키지 리포지토리에서 새로운 로케일을 설치할 수 있습니다. 그렇지 않다면 내 블로그에서 how to define a locale with a specific encoding (이 파일 이름 문제에 대해)을 읽을 수 있습니다.

+0

그게 효과가! 감사! – Jojje

+0

SFTP를 통해 전송할 때 항상 "en_US.iso8859_1"로 인코딩됩니까? – Jojje

+0

SFTP는 전송할 때 인코딩을 변경하지 않기 때문에 Windows에서 사용되는 인코딩 (아마도 Windows-1252)을 사용하여 파일 이름이 만들어집니다. 바이트 0x80-0x9f를 제외하고는 iso-8859-1과 동일합니다. – Joni

0

renameTo()는 무엇보다도 Windows 에서뿐만 아니라 유닉스 계열 시스템에서도 전혀 신뢰할 수 없습니다. 내가 제안하는 것은 몇 가지 검사를 수행하고 "재시도"메커니즘을 만들고이 post을 살펴 보는 것입니다. 내가 사용하는 인코딩을 지정할 수 있습니까 (UTF-8로 생각하는 태그를보고) 프로그램을 어떻게 시작합니까?

+0

jar 파일을 빌드하고이를 Linux 쉘에서 직접 호출합니다 (java -jar). – Jojje

1

파일 원본이 존재하지 않을 수 있습니다. renameTo 전에 존재 여부를 확인하십시오