【问题标题】:perl readdir not listing all filesperl readdir 没有列出所有文件
【发布时间】:2013-06-27 15:53:40
【问题描述】:

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

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

【问题讨论】:

  • 无法重现:mdkir test; cd test; touch crate.{c,h}pp imageLoader.{c,h}pp main.{c,h}pp util; cd ..; perl your-script 其中$folder 设置为test。它产生预期的输出。 — 循环中是否还有其他代码可以lastreturn
  • 我确实有一段代码会排除文件,但它没有打印任何内容。但这只是使用next,并没有被触发。
  • 当你运行那段 Perl 代码时,比如perl -e'$folder="."; rest_of_code_you_have_shown',你应该会看到预期的输出。你能确认这是否有效吗?如果该示例有效,但您的真实脚本无效,则问题可能出在脚本的其他部分,例如你的排除逻辑。
  • 嗯...看来我没有得到我最初预期的行为。我也在递归地使用这个函数来搜索子文件夹,但是一旦进入文件夹,它似乎就不再搜索文件夹了

标签: perl readdir


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢伙计。我正在使用 File::Find 来做其他事情,但我想要驱逐意味着我发现手动遍历更容易。不过以后可能会考虑改变它。
猜你喜欢
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2020-02-18
  • 1970-01-01
  • 2014-05-12
  • 2011-04-15
相关资源
最近更新 更多