考虑以下代码:
print cwd . "n";
$str= "../source"; # note the lower case 's'
chdir($str);
print cwd . "n";
如果我的当前目录是c:parentdirSource
(注意大写"S"(,则其输出为:
c:/pparentdir/Sourcec:/pparentdir/source
这会导致我的一个子程序出现问题,该子程序关心文件夹名称的正确大小写$str被传递到我的子例程中,所以我不能提前知道它是否有正确的大小写。如何确定与$str
匹配的路径的大小写正确名称?
更多详情请点击此处:
- 我意识到
../source
是一个病态的例子,但它起到了说明问题。即使$str
正在请求当前文件夹以外的文件夹 - 我尝试了很多选项,包括
rel2abs
$str
和其他,但它们似乎都返回"source
"而不是"Source
"> - 我可以在
$str/..
中搜索所有目录,将它们全部转换为绝对路径并将它们与CCD_ 10的绝对路径版本进行比较,但这似乎是个黑客。我希望有更优雅的
#!/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\t\Source>tC: \DOCUME~1\。。。\LOCALS~1\Temp\t\t\源C: \DOCUME~1\。。。\LOCALS~1\Temp\t\t源C: \文档和设置\。。。\本地设置\Temp\t\Source
我使用cygwin和svn,当svn找不到这些文件时,我发现了这个问题,因为它是区分大小写的
例如。$cd/cygdrive/c/svn/delphi2010/lib/checksum#不是真实情况下的
$svn-lssvn:警告:W155010:未找到节点"/cygdrive/c/svn/delphi2010/lib/checksum"。svn:E200009:无法列出所有目标,因为某些目标不存在
$eval cd$(cygpath$(perl-le'使用Win32;$d=cygpath -aw .
;chomp($d(;打印Win32::GetLongPathName($d('(
$pwd/cygdrive/c/svn/Delphi2010/lib/CheckSum#注意,案例已恢复