Используя Perl в Windows, как я могу убедиться, что в правильном случае я получаю путь, следующий за chdir? - PullRequest
4 голосов
/ 03 ноября 2011

Рассмотрим следующий код:

print cwd . "\n";
$str= "../source"; # note the lower case 's'    
chdir($str);
print cwd . "\n";

Если мой текущий каталог - c:\parentdir\Source (обратите внимание на заглавную 'S'), результат будет:

c:/parentdir/Source
c:/parentdir/source

Это вызывает проблемы в моей подпрограмме, которая заботится о правильном регистре имен папок.$ str передается в мою подпрограмму, поэтому я не могу заранее знать, имеет ли она правильный регистр.Как определить правильное для регистра имя пути, соответствующего $str?

Более подробно здесь:

  • Я понимаю, что ../source является патологическим примером, но этослужит для иллюстрации проблемы.Это происходит, даже если $str запрашивает папку, отличную от текущей.
  • Я перепробовал множество вариантов, включая rel2abs, глобальный поиск по $str и другие, но все они, похоже,вернуть "source" вместо "Source".
  • Я мог бы найти $str/.. для всех каталогов, преобразовать их все в абсолютные пути и сравнить их с версией абсолютного пути $str, ноэто похоже на взлом.Я надеялся на что-то более элегантное.

1 Ответ

10 голосов
/ 03 ноября 2011
#!/usr/bin/perl

use warnings; use strict;
use Cwd;
use File::Spec::Functions qw( canonpath );
use Win32;

print canonpath( cwd ), "\n";

chdir '../source';

print canonpath( cwd ), "\n";

print canonpath( Win32::GetLongPathName( cwd ) ), "\n";
C:\DOCUME~1\...\LOCALS~1\Temp\t\Source> t
C:\DOCUME~1\...\LOCALS~1\Temp\t\Source
C:\DOCUME~1\...\LOCALS~1\Temp\t\source
C:\Documents and Settings\...\Local Settings\Temp\t\Source
...