2009-10-06 13 views
6

Sadece doğru aramadığımı hayal edebiliyorum; Bu, burada sorulması gereken açık bir soru gibi görünüyor. Özür dilerim, bu bir kopyası.Windows'ta göreli olandan mutlak bir yol (dosya adı dahil) almak için ne Perl modül (ler) i kullanabilirim?

Komut satırı argümanı olarak bir dosya adı alacak bir Perl programı yazıyorum. Dosya adını (veya bağlı bir göreceli yolu olan dosya adını) mutlak bir yola (özellikle de Win32 :: OLE ile çalışmak için) dönüştürmem gerekiyor.

Cwd 's' abs_path 'kullanmayı denedim ve neredeyse istediğimi yapar, ancak bir Win32 yerine bir Unix stili yol kullanarak döndürür.

Yolu dönüştüren bir modül var mı, yoksa belki de daha iyi bir modül ilk etapta kullanılacak mı?

+3

Unix stil yolları ile ne demek istiyorsunuz? Örnek gösterebilir misin? Sürücü harfini kullanmıyor mu? Sadece eğik çizgiler varsa, Windows hangi yöne gittiği umurunda değil. Bu yolu şikayet eden bir şeye mi gönderiyorsunuz? –

+0

Sürücü harfini kullanır, ancak evet, eğik çizgileri kastediyorum. Bu soruyu sorduğumdan beri, Windows'un ileri eğik çizgileri kabul edeceğini öğrendim (henüz inşa ettiğim Win32 = OLE + Word VBA yapısını kullanarak denemedim - şimdi evdeyim). Fakat .. bir şey yapıp yapamayacağınıza bakılmaksızın .. belirsiz olmanın aksine, bilgisayara beklediği şeyi vermek mantıklı değil mi? Ve Windows 'durumunda, sadece ters eğik yollar sağladığını gördüm. Bu biraz pedantic ise, mantıklı mı? Gerçekten soruyorum .. Cevabı merak ediyorum. – romandas

cevap

13

ben File::Spec den rel2abs kullanın. Yine de dikkatli olmalısınız: getdcwd'u Cwd'dan arayabilir ve geçerli sürücü için geçerli çalışma dizinini istediğinizi varsayar. Dosya başka bir sürücüdeyse, bunu kendiniz düzeltmeniz veya temel yolu ayarlamak için ikinci bağımsız değişkenleri sağlamanız gerekir.

+0

+1 ve kabul edildi. Dosyanın başka bir sürücüde olup olmadığını, kullanıcının mutlak bir yol vereceğini varsayacağım. Dürüst olmak gerekirse, bir sürücüyü farklı bir sürücüde (komut satırı aracılığıyla) nasıl belirleyebileceğinden emin değilim, ancak bir sürücü harfi kullanmıyordum ... Bunun ile ilgili herhangi bir deneyiminiz var mı? – romandas

+2

Olmayan NT Windows eğlenceli. "D: foo.txt", D sürücüsündeki geçerli dizinde foo.txt'dir. Yol bileşeninin bir [geri] eğik çizgi ile başlamaması nedeniyle D sürücüsünün * root * değeri değildir. Her işlem, her bir sürücü için geçerli bir dizin * tutar. DOS eski bir şey ve bir Microsoft KB makalesine göre artık NT tabanlı pencereler için geçerli değil. – hobbs

+0

Bu soruna Windows 2003'te Archive :: Extract ile girdim. Düzeltmem, getdwcd'deki tahminleri atlamak ve cwd'yi kendim tedarik etmekti. Bu modülde çözümlenmiş bir hata var, bu yüzden yamayı görmek için rt.cpan.org'u kontrol edebilirsiniz. –

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'nin abs_path'ını kullanıyorum ve daha sonra gerçekten yapılması gerektiğinde eğik çizgileri dönüştürmek için bir regex kullanın. Ancak, çoğu kullanım için Unix tarzı eğik çizgilerin gayet iyi çalıştığını gördüm. Sadece ara sıra "bu sinir bozucu sınırlı programa bir dosya adı ilet" diye eğriltmek için gerek duyduğum.

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 

Ama sonra .. senle ya eşlenmiş sürücü referans olmadan, ağ yollarını çok kullanırım. Yolculuğunuz değişebilir.