2009-10-06 15 views
6

Ich kann mir nur vorstellen, dass ich nicht richtig suche; Das scheint eine offensichtliche Frage zu sein, die hier gestellt werden muss. Ich entschuldige mich, wenn dies ein Duplikat ist.Welche Perl-Module verwende ich, um einen absoluten Pfad (einschließlich Dateiname) von einem relativen Pfad unter Windows zu erhalten?

Ich schreibe ein Perl-Programm, das einen Dateinamen als Befehlszeilenargument verwendet. Ich muss den Dateinamen (oder den Dateinamen mit einem relativen angefügten Pfad) zu einem absoluten Pfad (speziell um mit Win32 :: OLE zu arbeiten) konvertieren.

Ich habe versucht mit Cwd 's' abs_path ', und das macht fast das, was ich will, aber es gibt es mit einem Unix-Stil-Pfad anstelle eines Win32 ein.

Gibt es ein Modul, das den Pfad konvertiert, oder vielleicht ein besseres Modul, um es überhaupt zu verwenden?

+3

Was meinen Sie mit Unix-Stil-Pfaden? Kannst du Beispiele zeigen? Verwendet es nicht den Laufwerksbuchstaben? Wenn es nur Schrägstriche sind, ist es Windows egal, in welche Richtung sie gehen. Passierst du diesen Weg zu etwas, das sich beschwert? –

+0

Es verwendet den Laufwerksbuchstaben, aber ja, ich meine die Schrägstriche. Ich habe seit dem Stellen dieser Frage gelernt, dass Windows die Vorwärtsstriche akzeptiert (obwohl ich es noch nicht versucht habe, das Win32 :: OLE + Word VBA-Konstrukt verwendend, das ich baue - ich bin jetzt zu Hause). Aber ... egal ob du damit durchkommst ... macht es keinen Sinn, dem Computer das zu geben, was er erwartet, anstatt mehrdeutig zu sein? Und in Windows habe ich nur gesehen, dass es Backslash-Pfade gibt. Macht das Sinn, wenn auch ein bisschen pedantisch? Ich frage wirklich .. Ich bin neugierig auf die Antwort. – romandas

Antwort

13

Ich benutze rel2abs von File::Spec. Sie müssen jedoch vorsichtig sein: das könnte getdcwd von Cwd aufrufen, und es wird davon ausgegangen, dass Sie das aktuelle Arbeitsverzeichnis für das aktuelle Laufwerk möchten. Wenn sich die Datei auf einem anderen Laufwerk befindet, müssen Sie dies selbst beheben oder das zweite Argument angeben, um den Basispfad festzulegen.

+0

+1 und akzeptiert. Ich gehe davon aus, wenn die Datei auf einem anderen Laufwerk ist, dass der Benutzer einen absoluten Pfad angeben wird. Um ehrlich zu sein, ich bin mir nicht sicher, wie man eine Datei (über die Befehlszeile) auf einem anderen Laufwerk angeben kann, aber keinen Laufwerksbuchstaben benutzt ... Haben Sie irgendwelche Erfahrungen damit? – romandas

+2

Nicht-NT Windows ist lustig. "D: foo.txt" ist foo.txt im aktuellen Verzeichnis auf Laufwerk D. Es ist nicht das * root * von Laufwerk D, da die Pfadkomponente nicht mit einem [zurück] Schrägstrich beginnt. Jeder Prozess verwaltet ein aktuelles Verzeichnis * für jedes Laufwerk *. Es ist eine DOS-Vermächtnis Sache, und nach einem Microsoft KB Artikel gilt nicht mehr für NT-basierte Windows. – hobbs

+0

Ich stieß auf dieses Problem mit Archive :: Extract auf Windows 2003. Mein Fix war, das Raten von getdwcd zu überspringen und das cwd selbst zu liefern. Es ist ein gelöster Fehler in diesem Modul, so dass Sie rt.cpan.org überprüfen können, um den Patch zu sehen. –

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

Ich benutze CWD's abs_path und dann eine Regex, um die Schrägstriche zu konvertieren, wenn ich wirklich brauche es getan. Aber ich habe festgestellt, dass für die meisten Anwendungen Unix-Stil Schrägstriche gut funktionieren. Es ist nur für gelegentliche "einen Dateinamen zu diesem ärgerlich begrenzten Programm" übergeben, dass ich am Ende die Schrägstriche konvertieren muss.

Aber dann .. Ich benutze viele Netzwerkpfade, mit oder ohne eine zugeordnete Laufwerksreferenz. Ihre Laufleistung kann variieren.

Verwandte Themen