我试图确定文件夹的哪个内容是一个目录,哪个是文件,我写了以下但结果不是我所期望的:
[navigationController pushViewController:ViewController animated:YES];
opendir DH, $dir or die "Cannot open Dir: $!";
my @dirs = grep !/^\.\.?$/, readdir DH ;
foreach my $files (@dirs) {
print $files."<br>";
if ( -d $files )
{
print $files." is a directory<br>";
}
}
closedir DH;
以dir开头的项目是实际目录,所以我的问题是if为什么失败发现它们的原因? 我做错了什么?
答案 0 :(得分:4)
$dir
遗失......
if ( -d "$dir/$files" )
{
print $files." is a directory<br>";
}
答案 1 :(得分:1)
chdir
到$dir
最简单,因此您不必在节点名称前加上路径。如果您运行的是Perl v5.10.1或更高版本,也可以use autodie
。最后,如果使用$_
作为循环控制变量(文件/目录名称),可以从print
,-d
和正则表达式匹配
喜欢这个
use strict;
use warnings;
use v5.10.1;
use autodie;
my ($dir) = @ARGV;
opendir my $dh, $dir;
chdir $dh;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
... # local expires. working directory returns to its original value
鉴于关于返回原始工作目录的ikegami(删除)评论,这里是使用File::chdir
模块整齐地执行此操作的示例。它会导出一个绑定变量$CWD
,如果您为其分配,它将更改您的工作目录。你也可以对它进行本地化,所以只需将上面的代码包装在大括号中并为$CWD
添加一个新的本地值就可以保持整洁。请注意,File::chdir
不是核心模块,因此您可能需要安装它
注意但是,进程可能会以一个无法chdir
的当前工作目录启动的可能性非常小。该模块无法解决该问题
use strict;
use warnings;
use v5.10.1;
use autodie;
use File::chdir;
my ($dir) = @ARGV;
{
opendir my $dh, $dir;
local $CWD = $dir;
while ( readdir $dh ) {
next if /\A\.\.?\z/;
print;
print " is a directory" if -d;
print "<br/>\n";
}
}