在Windows上使用Perl,如何确保在chdir之后的正确情况下获取路径?

时间:2011-11-03 12:47:28

标签: windows perl path case-sensitive cwd

请考虑以下代码:

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的绝对路径版本进行比较, 但这似乎是一个黑客。我希望有更优雅的东西。

2 个答案:

答案 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#注意情况已恢复

和svn ls再次起作用!