2011-11-03 102 views
4

考慮下面的代碼:在Windows上使用Perl,如何確保在chdir後的正確情況下獲得路徑?

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

如果我的當前目錄是c:\parentdir\Source(注意是大寫的「S」),這樣做的結果應該是:

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

這導致的子程序問題我關心文件夾名稱的正確大小寫。 $ str被傳遞給我的子程序,所以我不能提前知道它是否有正確的大小寫。如何確定匹配$str的路徑的正確名稱?

這裏更多的細節:

  • 我意識到../source是一個病態的例子,但是它起到 說明問題。即使$str正在請求除當前文件夾之外的 文件夾,它也會發生。
  • 我已經試過各種選項,包括rel2abs,在 $str一個水珠搜索,和其他人,但他們都似乎回到「source」,而不是 「Source」。
  • 我可以搜索$str/..所有目錄,它們全部轉換爲 絕對路徑,並比較他們的$str, 絕對路徑版本,但是這似乎是一個黑客。我希望有更優雅的東西。
+0

這不是不正確。通常Windows文件系統是不區分大小寫的,除非NTFS被另外配置。 – m0skit0

+0

絕對如此。不幸的是,我的子程序需要正確的情況,而不是簡單地操縱文件系統。所以,雖然Windows和Perl不關心,但我不得不。 – Craig

+0

不區分大小寫,是的,但它也是* case-preserving *。如果一個文件被創建爲'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

相關問題