2009-10-06 69 views
6

我只能想象我沒有正確搜索;這似乎是一個顯而易見的問題。如果這是重複的,我很抱歉。使用什麼Perl模塊從Windows上的相關文件獲取絕對路徑(包括文件名)?

我正在寫一個Perl程序,將一個文件名作爲命令行參數。我需要將文件名(或附有相對路徑的文件名)轉換爲絕對路徑(專門用於Win32 :: OLE)。

我試過使用Cwd的'abs_path',並且幾乎做到了我想要的,但它使用Unix樣式的路徑而不是Win32來返回它。

有沒有一個模塊可以轉換路徑,或者可能是一個更好的模塊來使用呢?

+3

你是什麼意思的Unix風格的路徑?你能展示例子嗎?它沒有使用驅動器號?如果它只是斜線,Windows不關心他們走的是什麼方向。你是否將這條道路傳遞給了抱怨的東西? – 2009-10-06 20:57:54

+0

它使用驅動器號,但是,我的意思是正斜槓。自從問這個問題以來,我已經學會了Windows將接受正斜槓(儘管我還沒有嘗試過使用Win32 :: OLE + Word VBA構造 - 我現在在家)。但是,無論你是否能夠做出某些事情,讓計算機得到它所期望的是不是有道理,而不是模棱兩可?而在Windows的情況下,我只看到它提供了反斜槓的路徑。這有道理,如果有點迂腐?我真的在問......我很好奇答案。 – romandas 2009-10-07 02:09:35

回答

13

我用rel2absFile::Spec。您必須小心:雖然可能會從Cwd調用getdcwd,並且它會假定您需要當前驅動器的當前工作目錄。如果文件位於其他某個驅動器上,則必須自己修復該文件或提供第二個參數以設置基本路徑。

+0

+1並被接受。我將假設文件是​​否在另一個驅動器上,用戶將給它一個絕對路徑。說實話,我不知道如何在不同的驅動器上指定一個文件(通過命令行),但不使用驅動器盤符...你有任何有關這種情況的經驗嗎? – romandas 2009-10-07 02:11:58

+2

非NT Windows很有趣。 「D:foo.txt」是驅動器D當前目錄中的foo.txt。它不是驅動器D的*根目錄*,因爲路徑組件不是以[back]斜槓開始的。每個進程維護每個驅動器的當前目錄*。這是一個DOS遺留問題,根據Microsoft知識庫文章不再適用於基於NT的窗口。 – hobbs 2009-10-07 07:06:17

+0

我在Windows 2003上用Archive :: Extract遇到了這個問題。我的修正是跳過getdwcd的猜測並自己提供cwd。這是該模塊中已解決的錯誤,因此您可以檢查rt.cpan.org以查看該補丁。 – 2009-10-07 09:23:34

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,然後使用正則表達式來轉換斜槓當我真的需要它做。但是我發現對於大多數用途來說,Unix風格的斜槓工作得很好。它只是偶爾「傳遞一個文件名到那個令人討厭的有限程序」,我最終需要轉換斜槓。

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 

但是然後..我使用了很多的網絡路徑,有或沒有映射的驅動器引用。你的旅費可能會改變。

相關問題