6
votes

Quel (s) module (s) PERL dois-je utiliser pour obtenir un chemin absolu (y compris le nom de fichier) d'un relatif sur Windows?

Je ne peux qu'imaginer que je ne cherche pas correctement; Cela semble être une question évidente à poser ici. Mes excuses s'il s'agit d'un duplicata.

J'écris un programme PERL qui prendra un nom de fichier en tant qu'argument de ligne de commande. Je dois 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 CWD 'S' ABS_PATH 'et que cela fait presque ce que je veux, Mais cela le renvoie à l'aide d'un chemin de style UNIX au lieu d'une Win32 une.

Y a-t-il un module qui convertira le chemin ou peut-être un meilleur module à utiliser en premier lieu?


2 commentaires

Que voulez-vous dire par des chemins de style unix? Pouvez-vous montrer des exemples? N'est-ce pas l'utilisation de la lettre de lecteur? Si c'est juste des barres obliques, Windows ne se soucie pas de quelle direction ils vont. Passez-vous cette voie à quelque chose qui se plaint?


Il utilise la lettre de lecteur, mais oui, je veux dire les esclaves en avant. J'ai appris depuis que je posais cette question à ce que Windows acceptera les barres obliques (bien que je ne l'ai pas encore essayé à l'aide de la construction Win32 :: Ole + Word VBA, je bâche - je suis à la maison maintenant). Mais .. peu importe si vous pouvez vous échapper à faire quelque chose .. N'a-t-il pas logique de donner à l'ordinateur ce qu'il s'attend, par opposition à être ambiguës? Et dans le cas de Windows, je n'ai vu que cela fournir des chemins backslashed. Cela a-t-il un sens, si un peu pédant? Je demande vraiment .. je suis curieux quant à la réponse.


4 Réponses :


4
votes
use File::Spec::Functions qw(rel2abs);
print rel2abs($ARGV[0]), "\n";

0 commentaires

-1
votes
my($foo) = abs_path($some_file);
$foo =~ s{/}{\\}g;

print "FOO: $foo\n";

0 commentaires

13
votes

J'utilise rel2abs de fichier :: spec . Vous devez faire attention, cela pourrait appeler getdcwd à partir de CWD , et il suppose que vous souhaitez que le répertoire de travail actuel du lecteur actuel. Si le fichier est sur un autre lecteur, vous devrez résoudre ce problème ou fournir le deuxième argument pour définir le chemin de base.


3 commentaires

+1 et accepté. Je vais supposer si le fichier est sur un autre lecteur, que l'utilisateur lui donnera une voie absolue. Pour être honnête, je ne sais pas comment on pourrait spécifier un fichier (via commande de commande) sur un autre lecteur mais pas utiliser une lettre de lecteur ... Avez-vous une expérience avec cela se produisant?


Les fenêtres non NT sont drôles. "D: FOO.TXT" est foo.txt dans le répertoire actuel sur le lecteur D. Ce n'est pas la racine de lecteur d parce que le composant de chemin ne commence pas par une barre oblique [arrière]. Chaque processus maintient un répertoire actuel pour chaque lecteur . C'est une chose héritée DOS, et selon un article Microsoft Ko ne s'applique plus aux fenêtres basées sur NT.


J'ai couru dans ce problème avec Archive :: Extrait sous Windows 2003. Mon correctif était de sauter le devinette de GetDWCD et de fournir la CWD moi-même. C'est un bug résolu dans ce module, vous pouvez donc vérifier rt.cpan.org pour voir le patch.



-1
votes

J'utilise ABS_Path de CWD, puis utilisez une regex pour convertir les barres obliques lorsque je vraiment em> besoin. Mais j'ai constaté que pour la plupart des utilisations, des barres obliques de style Unix fonctionnent bien. Ce n'est que pour l'occasion "Passer un nom de fichier à ce programme contrariement limité" que je finissais à 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


0 commentaires