zoukankan      html  css  js  c++  java
  • How do I list the files in a directory?

    原文地址:How do I list the files in a directory?

    You want a list of all the files, or all the files matching a certain pattern, or with a certain ending, in a directory

    The solution

    Reading directories is a bit like reading files. First you open the directory, then you read from it and then you close it. You use a directory handle much as you use a file handle.

    Step 1: Opening the directory

    To open the directory, we use a function called opendir. You use this much like the open function to open files. In the example below, we open the /tmp directory:

        #!/usr/bin/perl
        use strict;
        use warnings;
    
        my $directory = '/tmp';
    
        opendir (DIR, $directory) or die $!;
    

    Step 2: Reading the directory

    To read the files and directories in the directory we use the readdir function. readdir returns the name of each file or directory in the opened directory in turn when used in scalar context, or a list of the names of all files and directories in that directory when used in list context. This means that we can use readdir in a foreach loop (or any other loop construct):

        while (my $file = readdir(DIR)) {
    
            print "$file
    ";
    
        }
    

    Step 3: Closing the directory

    We use the function closedir to close the directory once we are finished with it. Like files, the directory will be closed when the program terminates, but sometimes you will need to explicitly close the directory:

        closedir(DIR);
    

    Directory Listing

    Provided your program has sufficient access to the directory being read, readdir will list every file and directory contained in that directory. However, you often will not want all files or directories. For example, it is quite common to exclude all filenames beginning with a period:

        #!/usr/bin/perl
    
        use strict;
        use warnings;
    
        my $dir = '/tmp';
    
        opendir(DIR, $dir) or die $!;
    
        while (my $file = readdir(DIR)) {
    
            # Use a regular expression to ignore files beginning with a period
            next if ($file =~ m/^./);
    
    	print "$file
    ";
    
        }
    
        closedir(DIR);
        exit 0;
    

    See further down for a more compact way of doing this.

    Find the directories

    Sometimes you may want to find all the directories in a directory. Remember that readdir() gives you the names of the files and directories, not the paths. If you want to test a file using any of the standard file tests, you need to use the full path:

        #!/usr/bin/perl
    
        use strict;
        use warnings;
    
        my $dir = '/tmp';
    
        opendir(DIR, $dir) or die $!;
    
        while (my $file = readdir(DIR)) {
    
            # A file test to check that it is a directory
    	# Use -f to test for a file
            next unless (-d "$dir/$file");
    
    	print "$file
    ";
    
        }
    
        closedir(DIR);
        exit 0;
    

    Find files ending in...

    Quite often you want to find all files ending in a given suffix. For example, you may want to find all files ending in .txt:

        #!/usr/bin/perl
    
        use strict;
        use warnings;
    
        my $dir = '/tmp';
    
        opendir(DIR, $dir) or die $!;
    
        while (my $file = readdir(DIR)) {
    
            # We only want files
            next unless (-f "$dir/$file");
    
            # Use a regular expression to find files ending in .txt
            next unless ($file =~ m/.txt$/);
    
            print "$file
    ";
        }
    
        closedir(DIR);
        exit 0;
    

    An advanced example

    A more advanced example is to use grep to filter out the files you want. The following example (based on a code sample from perldoc -f readdir) gets all the files (not directories) beginning with a period from the open directory. The filenames are found in the array @dots.

        #!/usr/bin/perl
    
        use strict;
        use warnings;
    
        my $dir = '/tmp';
    
        opendir(DIR, $dir) or die $!;
    
        my @dots 
            = grep { 
                /^./             # Begins with a period
    	    && -f "$dir/$_"   # and is a file
    	} readdir(DIR);
    
        # Loop through the array printing out the filenames
        foreach my $file (@dots) {
            print "$file
    ";
        }
    
        closedir(DIR);
        exit 0;
    

    File::Find

    You can use the File::Find module to recursively search through a directory (or directories). It is best used when you want to perform some operation on each file. See perldoc File::Find for more information.

    glob

    Another way of getting a directory listing - if you're only interested in the current directory and not in any sub-directories - is to use glob. You can pass glob a pattern (or patterns) to match and it will return any files that match. The example below will list all .pl and .pm files in the current directory:

        #!/usr/bin/perl
    
        use strict;
        use warnings;
    
        my @files = glob("*.pl *.pm");
    
        foreach my $file (@files) {
    
            print "$file
    ";
    
        }
    
        exit 0;
    

    See also

        perldoc -f opendir
        perldoc -f readdir
        perldoc -f closedir
        perldoc -f -X
        perldoc -f grep
        perldoc File::Find
        perldoc -f glob
        perldoc File::Glob
  • 相关阅读:
    HDU 3280 Equal Sum Partitions(二分查找)
    提高效率—编程中的技巧
    开发心得
    使用OpenCV读、操作、写图像并与bash合作对某个文件夹下全部图像进行相似处理
    观察者模式
    ORA-00932: inconsistent datatypes: expected
    Struts1应用、实现简单计算器、使用DispatchAction、显示友好的报错信息、使用动态Form简化开发
    Apple Swift编程语言新手教程
    I NEED A OFFER! (hdu 1203 01背包)
    端午遥想
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/6220784.html
Copyright © 2011-2022 走看看