Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Perl:检查字符串是否为有效目录,区分大小写_Windows_Perl_Strawberry Perl - Fatal编程技术网

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

Windows Perl:检查字符串是否为有效目录,区分大小写,windows,perl,strawberry-perl,Windows,Perl,Strawberry Perl,所以我遇到了一个问题。d开关将检查目录是否正确存在。但是,我需要它区分大小写。如果我有目录用户,并且我使用If-d“Users”,它将返回true。我需要它只在案例匹配时返回true 非常感谢您的帮助 代码: TLP建议将-d和eq结合起来。比如: if (-d $dirname && $dirname eq "Users"){ .... } 顺便说一句,对我来说,光是d一个人就行了。它是区分大小写的。尝试以下代码并将$dir修改为系统中存在的任何目录 #!/usr/bin/p

所以我遇到了一个问题。d开关将检查目录是否正确存在。但是,我需要它区分大小写。如果我有目录用户,并且我使用If-d“Users”,它将返回true。我需要它只在案例匹配时返回true

非常感谢您的帮助

代码:


TLP建议将
-d
eq
结合起来。比如:

if (-d $dirname && $dirname eq "Users"){
....
}
顺便说一句,对我来说,光是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";}

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

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

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

支票模块


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

是否有任何原因不能将
-d
eq
组合?@TLP这是什么意思?具体如何操作?
-d
将与文件系统一样区分大小写,因此除非文件系统是NTFS或(V)FAT,否则它很可能会按照您的意愿运行。@RogueBukkitDev我的意思是
如果(-d$file和$file eq'Users')
。或者,如果需要生成名称,可以先执行
$file(lc($file))
。我倾向于同意mojo的回答,并说这不可能是你问题的正确答案。如果文件系统区分大小写,
-d
执行所需操作。如果不是,则无法在同一目录中存在两个名称相同但大小写不同的文件。所以这可能是XY问题。但问题是我不确定目录名是什么。它可能是用户、服务器或任何东西。您能分享您的代码吗,因为我已经检查过,
-d
区分大小写。mojo在评论中建议的是正确的。除非文件系统是NTFS或(V),否则FAT
-d
将区分大小写工作。查看mojo关于如何处理此类案件的回答。
#!/usr/bin/perl
use strict;
use warnings;
my $dir = "/pathto/code";
if(-d $dir){print "DIR: $dir";}
else{print "$dir is not a directory";}
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");
}
use Win32;

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