perl readdir没有列出所有文件

时间:2013-06-30 09:37:41

标签: perl readdir

我遇到问题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";
}

我不明白为什么当我运行我的程序时,它没有向我显示该文件夹的最新内容。我有权查看这些文件,对我的脚本报告的文件和不符合条件的文件具有相同的权限。我有这个工作,似乎我已经改变某些地方来打破这个。

1 个答案:

答案 0 :(得分:8)

你说你正在递归地阅读目录。在这种情况下,请不要使用bareword文件句柄:它们是全局变量。当你递归到子目录时,你重新打开相同的 dirhandle到子目录。 readdir耗尽了这个目标。回到父目录,句柄(子目录句柄)为空,因此无法读取其他文件。

解决方案:使用词法文件句柄

opendir my $dir, $folder or die "Can't open $folder: $!";

while (readdir $dir) {
  ...;
}

虽然我们正在使用它,但您可能希望将文件系统转换卸载到File::Find。在那里,你只提供一个处理每个文件名的回调,指定一个开始目录,让File :: Find为你处理棘手的部分。