请考虑以下代码:
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
请求a,也会发生这种情况
当前文件夹以外的文件夹。rel2abs
,一个全局搜索
$str
和其他人,但他们似乎都返回“source
”而不是
“Source
”。$str/..
搜索所有目录,将它们全部转换为
绝对路径并将它们与$str
的绝对路径版本进行比较,
但这似乎是一个黑客。我希望有更优雅的东西。答案 0 :(得分: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
答案 1 :(得分: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);打印Win32 :: GetLongPathName($ d)'))
$ pwd / cygdrive / c / svn / Delphi2010 / lib / CheckSum#注意情况已恢复