【问题标题】:Using Perl on Windows, how can I ensure I get the path in the correct case following a chdir?在 Windows 上使用 Perl,如何确保在 chdir 之后获得正确的路径?
【发布时间】:2011-12-21 03:51:24
【问题描述】:

考虑以下代码:

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

【问题讨论】:

  • 没有错。通常 Windows 文件系统不区分大小写,除非 NTFS 另有配置。
  • 绝对正确。不幸的是,我的子程序需要正确的大小写,而不是简单地操作文件系统。所以,虽然 Windows 和 Perl 不在乎,但不幸的是我不得不这样做。
  • 不区分大小写,是的,但它也是保留大小写。如果文件创建为Foo,则可以使用foo 访问它,但系统知道它的名称是Foo

标签: windows perl path case-sensitive cwd


【解决方案1】:

我用的是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 'use Win32; $d=cygpath -aw .; chomp($d); print Win32::GetLongPathName($d)' ) )

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

svn ls 又可以工作了!

【讨论】:

    【解决方案2】:
    #!/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

    【讨论】:

    • 谢谢!在我看来,我什至不需要 canonpath。如果我发出以下命令:$str = Win32::GetLongPathName($str);,那么它似乎会更改为正确的大小写,即使 $str 指定了相对路径。
    • canonpath 只是为了在重要的情况下在路径中添加 Windows 样式的斜杠。
    • 明白了。这正是我想要的。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多