2009-10-06 9 views
6

私は正しく検索していないと思います。これはここで尋ねられる明白な質問のようです。これが重複していると私の謝罪です。Windows上の相対パスから絶対パス(ファイル名を含む)を取得するために使用するPerlモジュールは何ですか?

私はコマンドライン引数としてファイル名を取るPerlプログラムを書いています。私は、ファイル名(または相対パスが付いたファイル名)を絶対パス(Win32 :: OLEで動作するように)に変換する必要があります。

私はCwdの 'abs_path'を使って試してみましたが、それは私の望むものとほとんど同じですが、Win32の代わりにUnixスタイルのパスを使って返します。

パスを変換するモジュール、または最初に使用するより優れたモジュールがありますか?私はFile::Specからrel2absを使用

+3

Unixスタイルのパスはどういう意味ですか?あなたは例を見せていただけますか?ドライブレターを使用していませんか?それがちょうどスラッシュの場合、Windowsはどの方向に行くのか気にしません。あなたはこの道を不平を言っているものに渡していますか? –

+0

ドライブレターを使用しますが、スラッシュを意味します。私はWindowsがスラッシュを受け入れることを尋ねて以来、この質問をしてきました(私はビルド中のWin32 :: OLE + Word VBAコンストラクトを使っていませんでしたが、今は家にいます)。しかし、..あなたが何かをすることで逃げることができるかどうかにかかわらず、あいまいではなく、コンピュータに期待するものを与えるのは理にかなっていますか? Windowsの場合は、バックスラッシュされたパスを提供しているだけです。少し賢いのであれば意味がありますか?私は本当に頼んでいる...私は答えに不思議です。 – romandas

答えて

13

。あなたは注意する必要があります:それはをCwdから呼び出すことがあり、現在のドライブの現在の作業ディレクトリが必要であると仮定します。ファイルが他のドライブにある場合は、それを自分自身で修正するか、2番目の引数を指定してベースパスを設定する必要があります。

+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を使用して、が本当にに必要なときにスラッシュを変換するために正規表現を使用します。しかし、私はほとんどの用途で、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 

しかし、私はマップされたドライブ参照の有無にかかわらず、多くのネットワークパスを使用します。あなたのマイレージは異なる場合があります。

関連する問題