0

我在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";
}

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

4

1 回答 1

8

您说您正在递归地读取目录。在这种情况下,不要使用裸字文件句柄:它们是全局变量。当您递归到子目录时,您重新打开子目录的相同目录句柄。readdir排气管用这个管子。回到父目录,句柄(即子目录句柄)为空,因此无法读取更多文件。

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

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

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

当我们这样做时,您可能希望将文件系统遍历卸载到File::Find. 在那里,您只需提供一个处理每个文件名的回调,指定一个起始目录,然后让 File::Find 为您处理棘手的部分。

于 2013-06-30T10:25:17.833 回答