代码之家  ›  专栏  ›  技术社区  ›  PeterK

如何获取Perl中的嵌套目录内容

  •  2
  • PeterK  · 技术社区  · 16 年前

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

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

    $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);
    

    它总是失败,并显示消息“错误打开目录alex”。亚历克斯恰好是数据目录中的第一个目录。我的问题是-问题在哪里?这是否是实现我所尝试的目标的正确方法?我还担心如果数据文件夹中也有一个文件,这会使我失败,因为我不能用opendir打开它,或者我可以吗?

    PS:对不起,这糟糕的Perl代码-我还在努力学习这种语言。

    谢谢, 彼得

    4 回复  |  直到 11 年前
        1
  •  2
  •   Nikhil Jain    16 年前

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

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

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

    它会起作用的,试试看。

        2
  •  2
  •   ghostdog74    16 年前

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

        3
  •  2
  •   Michael Pakhantsov    16 年前

    您确定文件夹内只存在文件夹吗?添加附加检查:

    next if !(-d $dirname2);
    
        4
  •  2
  •   Brad Gilbert    11 年前

    这里有一个稍微清理过的问题发布版本。

    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版本上运行它,那么应该用包装while循环的条件 defined() .

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