Perl:检查字符串是否为有效目录,大小写为SENSITIVE

时间:2014-12-30 03:50:10

标签: windows perl strawberry-perl

所以我遇到了一个问题。 -d开关将检查目录是否存在就好了。但是,我需要它区分大小写。如果我有目录用户,如果有-d" UsErS",它将返回true。如果案例匹配,我需要它才返回true。

非常感谢任何帮助。

代码:

if (-d $cmdLine[1]) {
        chdir $cmdLine[1];
        print "CD: Successfully changed directory.\n";
} else {
        print "CD: Error: $cmdLine[1] is not a valid directory.\n";
}

3 个答案:

答案 0 :(得分:5)

文件名唯一的权威来源是文件系统本身。此代码段列出目标目录的父目录中的条目,并验证指定的名称是否与其中一个条目完全匹配。我在Linux上测试了远程NTFS共享(使用CIFS安装)。

use File::Basename;

$target = shift;
($base,$parent) = fileparse($target);

opendir($PARENT,$parent)
    or die("Error opening '$parent': $!");
%entries = map { $_ => 1 } readdir($PARENT);
closedir($PARENT);

if (-d $target && exists($entries{$base})) {
    print("'$target' exists (and correct case)\n");
} else {
    print("'$target' does not exist.\n");
}

我无法想象你如何在不区分大小写的文件系统(例如NTFS,(V)FAT,其他?)之外遇到这个问题,以及它们的问题(至少在Windows是操作系统时)管理它是因为你不一定能保证文件系统条目的大小写是你想要的。例如,尝试重命名仅更改大小写的NTFS文件。在Windows中,文件名不会更改。您必须将其完全更改为不同的内容,然后使用正确的大小写将其更改回旧名称。如果文件名全部为大写,则有(或者是)可配置的Windows设置可以执行特殊操作。

另一件需要考虑的事情是,如果文件系统不区分大小写,那么同一目录中可能只有两个条目只有大小写不同。我只是不明白这张支票应该考虑的有用意外情况。

答案 1 :(得分:2)

检查Win32模块,

use Win32;

if (-d $cmdLine[1] and $cmdLine[1] eq Win32::GetLongPathName($cmdLine[1])) { .. }

如果要将目录分隔符(use File::Spec::Functions 'canonpath';规范化为win32上的/),您可能还需要\

答案 2 :(得分:0)

TLP建议将-deq结合起来。类似的东西:

if (-d $dirname && $dirname eq "Users"){
....
}
只有BTW -d对我来说很好。它区分大小写。尝试以下代码并将$ dir修改为系统中存在的任何目录。

#!/usr/bin/perl
use strict;
use warnings;
my $dir = "/pathto/code";
if(-d $dir){print "DIR: $dir";}
else{print "$dir is not a directory";}