2011-11-03 3 views
4

다음과 같은 코드를 생각해 내 현재 디렉토리가 c:\parentdir\Source (자본 'S'를주의를) 인 경우Windows에서 Perl을 사용하면 어떻게 chdir 다음에 정확한 대소 문자를 구할 수 있습니까?

print cwd . "\n"; 
$str= "../source"; # note the lower case 's'  
chdir($str); 
print cwd . "\n"; 

을, 이것의 출력은 다음과 같습니다

 
c:/parentdir/Source 
c:/parentdir/source 

이의 서브 루틴에 문제가 발생 폴더 이름의 올바른 대소 문자를 구별하는 광산. $ str은 서브 루틴으로 전달되므로, 대소 문자가 올바른지 미리 알 수는 없습니다. $str과 일치하는 경로의 대소 문자가 정확한 이름을 어떻게 결정합니까? 여기

더 상세 :

  • ../source 병적 예임을 알지만 문제를 설명하기 위해 그 역할을한다. $str이 현재 폴더가 아닌 폴더를 요청하는 경우에도 발생합니다. rel2abs, $str에 글로브 검색, 등,하지만 그들은 모두를 포함
  • 내가 시도 다양한 옵션 대신 "Source"의 "source"를 반환 것 같다.
  • 모든 디렉토리에 대해 $str/..을 검색하고 모두를 절대 경로로 변환하고 절대 경로 버전 $str, 과 비교해보십시오.하지만 해킹처럼 보입니다. 나는 더 우아한 뭔가가 있기를 바랬다.
+0

그것은 잘못이 아니다. 보통 NTFS가 다르게 구성되어 있지 않으면 Windows 파일 시스템은 대소 문자를 구분하지 않습니다. – m0skit0

+0

절대적으로 사실입니다. 불행히도, 내 서브 루틴은 단순히 파일 시스템을 조작하는 것 이외의 이유로 올바른 대소 문자를 필요로합니다. 따라서 Windows와 Perl은 상관하지 않지만 필연적으로해야합니다. – Craig

+0

대소 문자를 구별하지 않지만 예 * 대소 문자를 구분하지 않습니다 *. 파일이'Foo'로 생성되면'foo'를 사용하여 접근 할 수 있지만 시스템은 그 이름이'Foo'임을 압니다. – ikegami

답변

10
#!/usr/bin/perl 

use warnings; use strict; 
use Cwd; 
use File::Spec::Functions qw(canonpath); 
use Win32; 

print canonpath(cwd), "\n"; 

chdir '../source'; 

print canonpath(cwd), "\n"; 

print canonpath(Win32::GetLongPathName(cwd)), "\n"; 
C:\DOCUME~1\...\LOCALS~1\Temp\t\Source> t 
C:\DOCUME~1\...\LOCALS~1\Temp\t\Source 
C:\DOCUME~1\...\LOCALS~1\Temp\t\source 
C:\Documents and Settings\...\Local Settings\Temp\t\Source
+0

감사합니다! 나는 심지어 내가 canonpath를 필요로하지 않는 것처럼 나에게 보인다. $ str = Win32 :: GetLongPathName ($ str);을 실행하면 $ str이 상대 경로를 지정하더라도 대소 문자가 바뀌는 것처럼 보입니다. – Craig

+1

'canonpath'는 문제가 발생한 경우에 경로에서 Windows 스타일의 슬래시를 얻는 것입니다. –

+0

Gotcha. 이것은 내가 찾고 있었던 바로 그 것이었다. 다시 한번 감사드립니다. – Craig