2009-10-06 4 views
6

내가 제대로 검색하지 않는다고 상상할 수 있습니다. 이것은 여기에 묻는 분명한 질문처럼 보입니다. 이게 중복되면 사과드립니다.Windows에서 상대적인 경로에서 절대 경로 (파일 이름 포함)를 얻기 위해 사용하는 Perl 모듈은 무엇입니까?

저는 명령 줄 인수로 파일 이름을 사용하는 Perl 프로그램을 작성하고 있습니다. 파일 이름 (또는 상대 경로가 첨부 된 파일 이름)을 절대 경로 (특히 Win32 :: OLE로 작업하기 위해)로 변환해야합니다.

Cwd의 'abs_path'를 사용하여 시도했는데 거의 원하는대로 수행했지만 Win32의 경로 대신 Unix 스타일의 경로를 사용하여 반환합니다.

경로를 변환 할 모듈이 있습니까? 아니면 처음부터 더 나은 모듈을 사용할 수 있습니까?

+3

유닉스 스타일 경로 란 무엇을 의미합니까? 예제를 보여줄 수 있습니까? 드라이브 문자를 사용하고 있지 않습니까? 단지 슬래시 인 경우 Windows는 그들이 어떤 방향으로 나아가는 지 신경 쓰지 않습니다. 이 길을 불평하고있는 것에 전달하고 있습니까? –

+0

드라이브 문자를 사용하지만 예, 슬래시를 의미합니다. 윈도우가 슬래시를 받아 들일 것이라는 점을 알게 된 이래로 배웠다. (아직 필자는 Win32 :: OLE + Word VBA 구조를 사용하지 않았지만, 지금은 집에있다.) 그러나 .. 당신이 뭔가를하는 것으로 도망 갈 수 있는지 여부에 상관없이, 모호하지 않은 것과는 달리 컴퓨터에 기대하는 것을 제공하는 것이 합리적이지 않습니까? 그리고 Windows의 경우에는 역 슬래시 경로 만 제공한다는 것을 알았습니다. 조금 의미심장하다면 그 말이 맞습니까? 나는 진실로 묻고있다. 나는 그 대답에 관해서 궁금하다. – romandas

답변

13

나는 File::Spec에서 rel2abs를 사용합니다. 그래도 신중해야합니다 : getdcwdCwd에서 호출 할 수 있으며 현재 드라이브의 현재 작업 디렉토리가 필요하다고 가정합니다. 파일이 다른 드라이브에 있으면 기본 경로를 설정하기 위해 직접 수정하거나 두 번째 인수를 제공해야합니다.

+0

+1을 수락합니다. 파일이 다른 드라이브에 있으면 사용자가 절대 경로를 제공 할 것으로 가정합니다. 솔직히 말하면, 내가 어떻게 다른 드라이브에서 파일을 (명령 줄을 통해) 지정할 수 있는지는 모르지만 드라이브 문자를 사용하지는 않습니다 ... 그런 일에 어떤 경험이 있습니까? – romandas

+2

NT가 아닌 Windows는 재미 있습니다. "D : foo.txt"는 드라이브 D의 현재 디렉토리에있는 foo.txt입니다. 경로 구성 요소가 [뒤로] 슬래시로 시작하지 않기 때문에 드라이브 D의 * 루트 *가 아닙니다. 각 프로세스는 각 드라이브 *에 대해 현재 디렉토리 *를 유지 관리합니다. 이것은 DOS의 유산이며 Microsoft KB 기사에 따르면 더 이상 NT 기반 창에 적용되지 않습니다. – hobbs

+0

Windows 2003의 Archive :: Extract에서이 문제가 발생했습니다. 내 수정 사항은 getdwcd에서 추측을 건너 뛰고 직접 cwd를 제공하는 것입니다. 이 모듈에서 해결 된 버그이므로 rt.cpan.org에서 패치를 확인하십시오. –

4
use File::Spec::Functions qw(rel2abs); 
print rel2abs($ARGV[0]), "\n"; 
-1
my($foo) = abs_path($some_file); 
$foo =~ s{/}{\\}g; 

print "FOO: $foo\n"; 
-1

저는 Cwd의 abs_path를 사용하고 나서 이 실제로 일 때 슬래시를 변환하기 위해 정규 표현식을 사용합니다. 하지만 대부분의 용도에서 유닉스 스타일의 슬래시가 잘 작동한다는 것을 알게되었습니다. 그것은 가끔씩 "그 성가신 제한된 프로그램에 파일 이름을 건네 주어야만"슬래시를 변환해야 할 필요가 있습니다.

use Cwd 'abs_path'; 
my $path = abs_path($rel_path); 

# and only if necessary... 
$path =~ s'[/\\]+'\\'g; # use Windows-style slashes 
$path =~ s'^\\'\\\\'; # handle network path 

하지만 .. 매핑 된 드라이브 참조 유무와 상관없이 많은 네트워크 경로를 사용합니다. 귀하의 마일리지가 다를 수 있습니다.

관련 문제