2009-10-06 8 views
6

Je peux seulement imaginer que je ne cherche pas correctement; cela semble être une question évidente à poser ici. Mes excuses si c'est un doublon. J'écris un programme Perl qui prendra un nom de fichier comme argument de ligne de commande. J'ai besoin de convertir le nom de fichier (ou le nom de fichier avec un chemin relatif attaché) à un chemin absolu (spécifiquement pour travailler avec Win32 :: OLE). J'ai essayé d'utiliser 'abs_path' de Cwd, et cela fait presque ce que je veux, mais il le retourne en utilisant un chemin de type Unix au lieu d'un chemin Win32.Quels modules Perl dois-je utiliser pour obtenir un chemin absolu (y compris le nom de fichier) à partir d'un module relatif sous Windows?

Existe-t-il un module qui va convertir le chemin, ou peut-être un meilleur module à utiliser en premier lieu?

+3

Pouvez-vous montrer des exemples? N'utilise-t-il pas la lettre de lecteur? Si c'est juste des barres obliques, Windows ne se soucie pas de savoir dans quelle direction ils vont. Passez-vous ce chemin à quelque chose qui se plaint? –

+0

Il utilise la lettre de lecteur, mais oui, je veux dire les barres obliques. J'ai appris depuis que j'ai posé cette question que Windows acceptera les barres obliques (même si je ne l'ai pas encore essayé en utilisant la construction Win32 :: OLE + Word VBA que je construis - je suis à la maison maintenant). Mais ... peu importe si vous pouvez vous en sortir en faisant quelque chose ... cela n'a-t-il pas de sens de donner à l'ordinateur ce qu'il attend, au lieu d'être ambigu? Et dans le cas de Windows, je l'ai seulement vu fournir des chemins rétro-éclairés. Cela a-t-il du sens, si c'est un peu pédant? Je demande vraiment .. Je suis curieux quant à la réponse. – romandas

Répondre

13

J'utilise rel2abs de File::Spec. Vous devez faire attention cependant: cela peut appeler getdcwd de Cwd, et il supposera que vous voulez le répertoire de travail actuel pour le lecteur actuel. Si le fichier se trouve sur un autre lecteur, vous devrez le réparer vous-même ou fournir le second argument pour définir le chemin de base.

+0

+1 et accepté. Je vais supposer si le fichier est sur un autre lecteur, que l'utilisateur lui donnera un chemin absolu. Pour être honnête, je ne suis pas sûr comment on pourrait spécifier un fichier (via la ligne de commande) sur un lecteur différent, mais pas utiliser une lettre de lecteur ... Avez-vous une expérience avec ce qui se passe? – romandas

+2

Non Windows NT est drôle. "D: foo.txt" est foo.txt dans le répertoire courant sur le lecteur D. Ce n'est pas la * racine * du lecteur D car le composant path ne commence pas par une barre oblique [back]. Chaque processus maintient un répertoire courant * pour chaque lecteur *. C'est un héritage de DOS, et selon un article de Microsoft KB ne s'applique plus aux fenêtres basées sur NT. – hobbs

+0

J'ai rencontré ce problème avec Archive :: Extract sur Windows 2003. Mon but était de passer le devin de getdwcd et de fournir le cwd moi-même. C'est un bug résolu dans ce module, donc vous pouvez vérifier sur rt.cpan.org pour voir le patch. –

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

J'utilise abs_path de Cwd, puis j'utilise une regex pour convertir les barres obliques quand I vraiment en a besoin. Mais j'ai trouvé que pour la plupart des utilisations, les barres obliques de style Unix fonctionnent très bien. C'est seulement pour occasionnellement "passer un nom de fichier à ce programme énormément limité" que je finis par avoir besoin de convertir les barres obliques.

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 

Mais alors .. J'utilise beaucoup de chemins réseau, avec ou sans référence de lecteur mappée. Votre kilométrage peut varier. Que voulez-vous dire par chemins de style Unix?