4

考虑以下代码:

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

如果我的当前目录是c:\parentdir\Source(注意大写“S”),则输出将是:

c:/parentdir/源
c:/父目录/源

这会导致我的一个子程序出现问题,该子程序关心文件夹名称的正确大小写。$str 被传递给我的子程序,所以我无法提前知道它是否有正确的大小写。如何确定匹配路径的大小写正确名称$str

更多细节在这里:

  • 我意识到这../source是一个病态的例子,但它可以说明问题。即使$str正在请求当前文件夹以外的文件夹,也会发生这种情况。
  • 我尝试了许多选项,包括rel2abs在 上进行全局搜索 $str等,但它们似乎都返回“ source”而不是“ Source”。
  • 我可以搜索$str/..所有目录,将它们全部转换为绝对路径并将它们与绝对路径版本进行比较$str,但这似乎是一个 hack。我希望有更优雅的东西。
4

2 回答 2

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\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
于 2011-11-03T13:49:26.350 回答
0

我使用cygwin和svn,当svn找不到文件时我发现了这个问题,因为它区分大小写

例如 $ cd /cygdrive/c/svn/delphi2010/lib/checksum # 不是真的情况

$ svn ls svn:警告:W155010:找不到节点“/cygdrive/c/svn/delphi2010/lib/checksum”。svn: E200009: 无法列出所有目标,因为某些目标不存在

$ eval cd $( cygpath $( perl -le '使用 Win32; $d= cygpath -aw .; chomp($d); print Win32::GetLongPathName($d)' ) )

$ pwd /cygdrive/c/svn/Delphi2010/lib/CheckSum #注意大小写恢复

和 svn ls 再次工作!

于 2020-03-13T21:17:22.317 回答