Qual (s) módulo (s) Perl eu uso para obter um caminho absoluto (incluindo o nome do arquivo) de um relativo no Windows?

StackOverflow https://stackoverflow.com/questions/1527638

Pergunta

Só posso imaginar que não estou pesquisando corretamente; Parece uma pergunta óbvia a ser feita aqui. Minhas desculpas se isso é uma duplicata.

Estou escrevendo um programa PERL que assumirá um nome de arquivo como um argumento da linha de comando. Preciso converter o nome do arquivo (ou o nome do arquivo com um caminho relativo anexado) em um caminho absoluto (especificamente para trabalhar com o Win32 :: ole).

Eu tentei usar Cwd'S' ABS_PATH ', e isso quase faz o que eu quero, mas o retorna usando um caminho no estilo Unix em vez de um Win32.

Existe um módulo que converterá o caminho, ou talvez um módulo melhor para usar em primeiro lugar?

Foi útil?

Solução

eu uso rel2abs a partir de Arquivo :: Spec. Você tem que ter cuidado: isso pode ligar getdcwd a partir de Cwd, e assumirá que você deseja o diretório de trabalho atual para a unidade atual. Se o arquivo estiver em outra unidade, você precisará corrigi -lo ou fornecer o segundo argumento para definir o caminho base.

Outras dicas

use File::Spec::Functions qw(rel2abs);
print rel2abs($ARGV[0]), "\n";
my($foo) = abs_path($some_file);
$foo =~ s{/}{\\}g;

print "FOO: $foo\n";

Eu uso o ABS_PAT da CWD e depois uso um regex para converter as barras quando eu verdade Precisa fazer. Mas descobri que, para a maioria dos usos, as barras em estilo Unix funcionam muito bem. É apenas para o ocasional "passar um nome de arquivo para esse programa irritantemente limitado" que acabo precisando converter as barras.

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

Mas então .. eu uso muitos caminhos de rede, com ou sem uma referência de unidade mapeada. Sua milhagem pode variar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top