간단한 바꾸기로 Windows 파일 경로를 Unix 파일 경로로 변환하는 것이 안전합니까?


12

: 그래서 예를 들어 내 모든 파일이 같은 유닉스 머신에 윈도우 머신에서 전송됩니다 있도록했다 말 C:\test\myFile.txt{somewhere}/test/myFile.txt(드라이브 문자가이 시점에서 무관하다).

현재 우리가 작성한 유틸리티 라이브러리는 모든 백 슬래시를 슬래시로 간단하게 대체하는 방법을 제공합니다.

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

슬래시는 예약되어 있으며 파일 이름의 일부가 될 수 없으므로 디렉토리 구조를 유지해야합니다. 그러나 Windows와 유닉스 경로 사이에 걱정해야 할 다른 합병증이 있는지 확실하지 않습니다 (예 : ASCII가 아닌 이름 등)


4
공백 만 조심하십시오. Windows 폴더 이름에 공백을 두는 것이 유닉스 디렉토리 이름보다 훨씬 일반적입니다. 특히 "\ Program Files"는 항상 나를 가져옵니다. 경로를 사용하는 방법에 따라 "\"로 공백을 이스케이프해야 할 수도 있습니다.
Rob

1
단순화를 위해 @delnan, 변수 경로를 제외하도록 경로의 범위를 제한합시다.
MxLDevs

2
@MxyL 환경 변수를 사용하는 대신 경로를 하드 코딩 할 때 문제가 해결되지 않습니다. 폭파하지 않는 길을 원한다면 괜찮을 것입니다. 의미있는 경로를 원하거나 다른 소프트웨어 (또는 사용자의 기대치 등)와 상호 작용하려면 경로 별 판단 호출이 필요합니다.

1
@delnan 나는 주로 유효한 경로를 만드는 데 중점을두고 있지만 좋은 지적입니다. 내가 변환하고있는 경로는 그 자체로 의미가있을 정도로 단순해야합니다.
MxLDevs

3
Linux에서는 파일 이름에 백 슬래시를 사용할 수 있으므로 Linux 경로에서 백 슬래시를 바꾸면 유효하지 않은 디렉토리가 추가 될 수 있습니다. 예를 들어 Linux의 /foo\\bar경우와 동일하지 않습니다 /foo/bar.

답변:


7

예, 경우 에만 교체 할 Windows에서를, 다른 시스템에서 실행 때 전원을 끄십시오.

에 교체를하는 유닉스 계열 시스템입니다 잘못 때문에 \A는 플랫폼 유닉스 계열의 파일이나 디렉토리 이름에 유효한 문자가. 이러한 플랫폼 만 NUL하고는 /파일 및 디렉토리 이름에서 금지된다.

또한 일부 Windows API 함수 (주로 하위 수준 함수) 에서는 슬래시를 사용할 수 없으므로 백 슬래시 와 함께 사용해야 합니다.


4

예, 그러나이 모든 것은 논점입니다. Java는 Windows에서 슬래시를 백 슬래시로 완벽하게 변환합니다. 구성에 하드 코딩되거나 저장된 모든 경로에 슬래시를 사용할 수 있으며 두 플랫폼 모두에서 작동합니다.

개인적으로, 나는 항상 이스케이프 문자 가 아니기 때문에 Windows에서도 슬래시를 사용합니다 . 원시 경로가 코드에 있거나 속성 파일에 외부화되어 있는지 여부에 관계없이 동일한 방식으로 인코딩합니다.

시도 해봐! 이것은 Windows에서 작동합니다. 분명히 실제 경로를 존재하고 사용자에게 읽을 권한이있는 경로로 변경하십시오.

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

보너스 : 같은 경로에 슬래시 혼합 할 수도 있습니다 !

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

1
전체 답변을 읽으면 항상 Unix 파일 구분 기호를 사용하면 변환이 필요없는 두 곳에서 올바르게 작동 한다는 것을 알 수 있습니다.

이 질문은 파일 이 전송 될 것이며 파일 이름 이 어떻게 저장 되는지 열어 둡니다 . 그 점에 대한 설명을 요구하는 질문에 의견을 추가했습니다. 답변을 바탕으로 답변을 적절히 수정하겠습니다.

프로그램이 실제로 전송되는 모든 파일의 수동 입력 목록을 포함하지는 않습니다. 파일을 열거하는 데 일부 자동화 된 메커니즘이 사용되고있을 가능성이 훨씬 높습니다. 질문에 명시된대로 문제의 매개 변수를 고려할 때이 메커니즘은 기존의 Windows 스타일 경로를 제공합니다. 현재의 형태에서,이 대답은 심지어 방법이나 말하지 않고 대신 다른 문제를 해결하기 위해 영업을 말하고 있음을 그들은 다른 문제로 그들의 변환해야합니다.
Eliah Kagan

내 이전 의견을 읽으십시오.

1
Windows 는 fowrard와 backslash를 모두 인식하며 MS-DOS 초기부터 그렇게되었습니다. 즉, 모든 Microsoft OS 커널은 슬래시 구분 기호를 지원했습니다. 초기 COMMAND.COM통역사는 런타임 환경 설정을 가졌습니다. 통역사가 인쇄 및 파싱에 사용할 슬래시를 구성 할 수 있습니다.
Kaz

3

Windows의 또 다른 문제는 기존 드라이브 문자뿐만 아니라 UNC 표기법도 지원한다는 것입니다.

원격 파일 서버의 파일은로 액세스 할 수 있습니다 \\server\sharename\path\filename.


1
나는 이것이 지금까지 인용 된 유일한 관심사이며 실제로이 응용 프로그램의 문제라고 생각합니다. UNC 경로가 있으면 유닉스 스타일 경로로 유용하게 변환 할 수 없습니다 .
Jules

2

아니요 . 경로 구분자 ( "\ vs /")보다 훨씬 더 많은 사항을 고려해야합니다. Rob Y가 언급했듯이 공간을 처리하는 방법과 Windows 사용 빈도가 있습니다. 두 환경에는 서로 다른 잘못된 문자가 있습니다. "\"로 이스케이프 될 때 거의 모든 것을 허용하는 유닉스의 의지가 있습니다. 임베디드 공간을 처리하기 위해 Windows에서 ' "'를 사용하고 Windows에서 UCS-16을 사용하고 Unix에서 ASCII 또는 UTF-8을 사용합니다.

, ,

그러나 조작해야하는 경로 이름에 제약을 줄 수있는 많은 응용 프로그램의 경우 실제로 제안한 방식으로 수행 할 수 있습니다. 그리고 그것은 적어도 많은 경우에 효과가있을 것입니다.


1
이러한 문제가 제기 된 질문에 대해 유효하지 않다고 생각합니다. 공간 처리는 사용자 인터페이스 문제입니다. 유닉스 시스템 Windows뿐 아니라 파일 이름의 공백도 처리 할 수 ​​있습니다. Windows 불법 문자는 Unix 문자의 상위 집합입니다. Windows 파일 이름에는 백 슬래시가 없어야합니다 (변환 될 디렉토리 구분 기호 제외). 포함 된 공백에 따옴표를 사용하는 것은 파일 처리 문제가 아니라 사용자 인터페이스 수준의 문제입니다. 변환 코드는 분명히 Java로되어 있으므로 UCS16-> UTF8 변환을 자동으로 처리해야합니다.
Jules

-1

MS-DOS로 시작하는 모든 Microsoft 운영 체제는 커널 수준에서 슬래시와 백 슬래시를 모두 이해했습니다 .

따라서 Windows에서는 자유롭게 이들 사이를 변환 할 수 있습니다. 둘 다 예약 된 구분 기호와 동일한 상태입니다. 유효한 경로에서, 커널에 관한 한 그 의미를 변경하지 않고 백 슬래시를 슬래시로 바꾸거나 그 반대로 바꿀 수 있습니다.

초기 버전의 DOS에서 Microsoft의 command.com인터프리터는 경로를 표시하고 구문 분석하는 데 사용되는 슬래시를 구성 가능한 환경 설정으로 만들었습니다. 그것은 결국 제거되었습니다.

Windows 쉘 ( explorer.exe) 과 같은 Windows의 일부 사용자 공간 프로그램은 슬래시를 좋아하지 않습니다. 그것은 단지 그 프로그램들에서 엉뚱한 프로그래밍입니다.


1
이것이 사실이지만 필자는 이미 백 슬래시를 포함했을 기존 경로 이름 변환과 관련된 (AIUI) OP의 질문에 도움이되지 않는다고 생각합니다. 그것은 이다 그냥 슬래시를 사용하고 대부분의 상황에서 작동 할 수 있음을 실현하기 위해 크로스 플랫폼 코드를 작성하는 데 매우 유용하지만,이 경우에 나는 할 수 있다고 생각하지 않습니다.
Jules

@Jules OP는 Windows에서 파일을 전송하고 있습니다. 이 답변은 대체 할 백 슬래시가 없음을 설명합니다. 그것들은 Windows 파일 시스템 자체에는 전혀 없습니다. 모든 경로는 슬래시로 표시 할 수 있습니다 (Windows도이를 이해합니다).
Kaz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.