在Windows上使用Perl,我如何确保在chdir之后获得正确的路径



考虑以下代码:

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#注意,案例已恢复

svn-ls又起作用了

相关内容

  • 没有找到相关文章

最新更新