我遇到问题readdir
实际上没有读取给定文件夹中的所有文件。我只看到以下三个文件和一个文件夹:
main.cpp
main.hpp
imageLoader.hpp
util
虽然,如果我使用bash ls -lat
,我会收到以下列出的文件:
drwxrwxr-x 11 me me 4096 Jun 30 10:48 ..
-rw-rw-r-- 1 me me 7797 Jun 30 10:19 main.cpp
-rw-rw-r-- 1 me me 690 Jun 30 10:18 crate.hpp
-rw-rw-r-- 1 me me 2691 Jun 30 10:18 crate.cpp
drwxrwxr-x 2 me me 4096 Jun 30 00:02 util
drwxrwxr-x 3 me me 4096 Jun 29 23:37 .
-rw-rw-r-- 1 me me 2584 Jun 22 19:38 imageLoader.cpp
-rw-rw-r-- 1 me me 333 Jun 22 12:56 imageLoader.hpp
-rw-rw-r-- 1 me me 52 Jun 16 17:03 main.hpp
我使用的代码并不是太疯狂(编辑以保持相关性):
opendir FOLDER, $folder or die "failed to open";
FILELOOP: while (readdir FOLDER){
next if /^\.\.?$/; # I do have to manually skip these right?
print "$_\n";
}
我不明白为什么当我运行我的程序时,它没有向我显示该文件夹的最新内容。我有权查看这些文件,对我的脚本报告的文件和不符合条件的文件具有相同的权限。我有这个工作,似乎我已经改变某些地方来打破这个。
答案 0 :(得分:8)
你说你正在递归地阅读目录。在这种情况下,请不要使用bareword文件句柄:它们是全局变量。当你递归到子目录时,你重新打开相同的 dirhandle到子目录。 readdir
耗尽了这个目标。回到父目录,句柄(子目录句柄)为空,因此无法读取其他文件。
解决方案:使用词法文件句柄:
opendir my $dir, $folder or die "Can't open $folder: $!";
while (readdir $dir) {
...;
}
虽然我们正在使用它,但您可能希望将文件系统转换卸载到File::Find
。在那里,你只提供一个处理每个文件名的回调,指定一个开始目录,让File :: Find为你处理棘手的部分。