如何读取文件夹并生成树形结构?

如何读取文件夹并生成树形结构?

高手请指定一二,谢谢

like this?

[Copy to clipboard] [ - ]
CODE:
C:.
├─(null)
├─.cpan
│  ├─build
│  │  ├─ANDK000
│  │  ├─GAAS000
│  │  │  └─blib
│  │  │      ├─arch
│  │  │      │  └─auto
│  │  │      │      └─LWP
│  │  │      └─lib
│  │  │          └─auto
│  │  │              └─LWP
│  │  ├─GAAS001
│  │  │  └─blib
│  │  │      ├─arch
│  │  │      │  └─auto
│  │  │      │      └─URI
│  │  │      └─lib
│  │  │          └─auto
│  │  │              └─URI
│  │  ├─GBARR000
│  │  │  └─blib
│  │  │      ├─arch
│  │  │      │  └─auto
│  │  │      │      └─NetFTP
│  │  │      └─lib
│  │  │          └─auto
│  │  │              └─NetFTP
│  │  └─SZABGAB000
│  │      └─blib
│  │          ├─arch
│  │          │  └─auto
│  │          │      └─SpreadsheetParseExcel
│  │          └─lib
│  │              └─auto
│  │                  └─SpreadsheetParseExcel
│  └─sources
│      ├─authors
│      │  └─id
│      │      ├─A
│      │      │  └─AN
│      │      │      └─ANDK
│      │      ├─G
│      │      │  ├─GA
│      │      │  │  └─GAAS
│      │      │  └─GB
│      │      │      └─GBARR
│      │      └─S
│      │          └─SZ
│      │              └─SZABGAB
│      └─modules
├─.DownloadManager
├─.gnupg
├─.jinit
├─.links
├─.p4qt
├─.ssh
├─.subversion
│  └─auth
│      ├─svn.simple
│      ├─svn.ssl.server
│      └─svn.username
├─.texmf
│  ├─config
│  │  └─web2c
│  └─var
│      ├─fonts
│      │  └─map
│      │      ├─dvipdfm
│      │      │  └─updmap
│      │      ├─dvips
│      │      │  └─updmap
│      │      └─pdftex
│      │          └─updmap
│      └─web2c
├─Contacts

对,大概就这个样子,请问用perl能实现吗?
any thing is possible


QUOTE:
原帖由 030802127 于 2007-10-11 14:44 发表
对,大概就这个样子,请问用perl能实现吗?

帮你写了一下。供参考:
#!/usr/bin/perl -w

# jim zhang @ 2007

use strict;

print "|___$ARGV[0]\n";
my @basenum = split/\//,$ARGV[0];
tree($ARGV[0]);

sub tree
{
        my $path=shift;
        my @files;
        opendir(THISDIR,$path);
        @files=readdir THISDIR;
        closedir THISDIR;
        my @number = split(/\//,$path);
        my $num = @number - @basenum;
        my $tab = "|   "x$num;
        my $tab1 = "|   "x($num+1);
        for(@files)
        {
                next if(/^\.$/);
                next if(/^\.\.$/);
                if(-d $path.'/'.$_)
                {
                        print "$tab1\|___$_\n";
                        tree($path.'/'.$_);
                }
                else
                {
                        print "$tab1\|___$_\n";
                }
        }
        return;
}
&printDirTree('TestDir');

sub printDirTree {
    my $curr_dir = $_[0];
   
    # print the 'root' dir
    if (!$_[1]) {
        print "$curr_dir\n" ;
        $_[1] = '';
    }
   
    # get all entries in current dir except '.' '..'
    opendir DIR, $curr_dir or die "Cannot open $curr_dir: $!\n";
    my @files = grep { !/^(\.|\.\.)$/ } (readdir DIR);
    closedir DIR;
   
    for (0..$#files) {
        my $pre = $_[1];
        
        if ($_ < $#files) {
            print $pre, '├─', $files[$_], "\n";
            $pre .= '│  ';
        }
        else {
            print $pre, '└─', $files[$_], "\n";;
            $pre .= '    ';
        }
        
        if (-d "$curr_dir/$files[$_]") {
            &printDirTree("$curr_dir/$files[$_]", $pre);
        }
    }
}


在Win下和tree的图形效果一致.

TestDir
├─Dir_1_1
│  ├─Dir_2_1
│  │  ├─input.txt
│  │  └─Copy of input.txt
│  ├─Dir_2_2
│  ├─input.txt
│  ├─Copy of input.txt
│  └─Z1
│      └─Z2
├─Dir_1_2
│  ├─Dir_2_1
│  │  └─input.txt
│  ├─Dir_2_2
│  │  └─Z1
│  │      └─Z2
│  └─Dir_2_3
├─Dir_1_3
│  ├─Dir_2_1
│  ├─Dir_2_2
│  │  ├─input.txt
│  │  └─Copy of input.txt
│  ├─input.txt
│  └─Copy of input.txt
└─Z1
    └─Z2

perl -e "system('tree')"