【问题标题】:How to get nested directories contents in Perl如何在 Perl 中获取嵌套目录的内容
【发布时间】:2011-04-08 15:42:27
【问题描述】:

我正在尝试编写一个脚本来处理某些文件。数据是这样组织的:有一个文件夹(我们称之为 X),我的脚本将放置在其中。在同一个文件夹中,有一个名为“data”的子文件夹。这包含多个具有不同名称的子文件夹,每个子文件夹都包含许多文件(没有其他子文件夹,只有文件)。我需要处理子文件夹中的所有文件(更具体地说,对每个文件运行一个函数),然后合并子文件夹中所有文件的结果,因此对于每个文件夹都有一个结果(无论它包含多少文件)。

问题是,我无法访问这些文件,因此我可以在它们上运行我的函数。我现在拥有的是这样的:

$dirname = "data";

opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";

while( ($dirname2 = readdir(DIR)) ) 
{
    next if $dirname2 eq ".";
    next if $dirname2 eq "..";

    opendir ( DIR2, $dirname2 ) || die "Error in opening dir $dirname2\n";

    while( ($file = readdir(DIR2)) ) 
    {
        next if $file eq ".";
        next if $file eq "..";

        print( "file:$file\n" );
    }

    closedir(DIR2);

}
closedir(DIR);

它总是失败并显示消息“打开 dir alex 时出错”。 'alex' 恰好是数据目录中的第一个目录。我的问题是——问题出在哪里?这甚至是如何实现我想要做的正确方法吗?我也担心如果数据文件夹中还有一个文件,我会失败,因为我无法用 opendir 打开它,或者我可以吗?

PS:抱歉,Perl 代码很糟糕——我仍在努力学习这门语言。

谢谢, 彼得

【问题讨论】:

  • die "Error in opening dir $dirname: $!" 会给你原因,见perldoc perlvar。更好的是,删除|| die… 部分,添加use autodie qw(:all); 并让autodie 模块处理/报告错误。

标签: perl file directory


【解决方案1】:

您可以尝试File::Path - 创建或删除目录树

当我运行您的程序时,我认为您必须在打开目录时指定完整路径,即。,

opendir ( DIR2, $dirname.\\.$dirname2 ) || die "Error in opening dir $dirname2\n"; #running code on windows

它会起作用的,试试吧。

【讨论】:

  • 这是一个关键的错误。谢谢!
【解决方案2】:

您可以使用File::Find 查找文件嵌套目录

【讨论】:

    【解决方案3】:

    你确定里面的文件夹只存在文件夹吗?添加额外检查:

    next if !(-d $dirname2);
    

    【讨论】:

      【解决方案4】:

      这是问题中发布的内容的略微清理版本。

      use strict;
      use warnings;
      use autodie;
      use File::Spec::Functions qw'catdir catfile';
      
      my $dirname = "data";
      
      {
          opendir my $dir_h, $dirname;
      
          while( my $dirname2 = readdir($dir_h) ){
              next if $dirname2 eq ".";
              next if $dirname2 eq "..";
      
              $dirname2 = catdir( $dirname, $dirname2 );
              next unless -d $dirname2;
              opendir my $dir_h2, $dirname2;
      
              while( my $file = readdir($dir_h2) ) 
              {
                  next if $file eq ".";
                  next if $file eq "..";
      
                  $file = catfile($dirname2,$file);
                  if( -f $file ){
                    print( "file:$file\n" );
                  }
              }
              # $dir_h2 automatically closes here
          }
          # $dir_h automatically closes here
      }
      

      如果您要在早于 5.12.0 的 Perl 版本上运行它,您应该使用 defined() 包装 while 循环的条件。

          while( my $dirname2 = readdir($dir_h) ){
          while( defined( my $dirname2 = readdir($dir_h) ) ){
      

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多