2009-06-25 5 views

答えて

65

あなたが与えられたディレクトリの内容を取得したい場合は、とだけ(つまりなしサブディレクトリ)、最良の方法は、/のreaddir/closedirのをopendir関数を使用することです:

opendir my $dir, "/some/path" or die "Cannot open directory: $!"; 
my @files = readdir $dir; 
closedir $dir; 

ます。また、使用することができます。

my @files = glob($dir . '/*'); 

私の意見では、グロブはかなり複雑なので(結果を自動的にフィルタリングすることができます)、それを使ってディレクトリのすべての要素を取得するのは簡単すぎるようです。

あなたはディレクトリとサブディレクトリのすべてのコンテンツを取得する必要がある一方、1つの標準液は基本的にあります:

use File::Find; 

my @content; 
find(\&wanted, '/some/path'); 
do_something_with(@content); 

exit; 

sub wanted { 
    push @content, $File::Find::name; 
    return; 
} 
+0

私はいつもreaddirがパス全体ではなく相対ファイル名のリストを返すことを忘れています! –

+0

この作業のためにグロブを使用しないようにしてくれてありがとう。これに対してglobbingを使用することのもう一つの欠点は、隠しファイル(ドットで始まるファイル)が見つからないことです。 – josch

9

これはそれを行う必要があります。

my $dir = "bla/bla/upload"; 
opendir DIR,$dir; 
my @dir = readdir(DIR); 
close DIR; 
foreach(@dir){ 
    if (-f $dir . "/" . $_){ 
     print $_," : file\n"; 
    }elsif(-d $dir . "/" . $_){ 
     print $_," : folder\n"; 
    }else{ 
     print $_," : other\n"; 
    } 
} 
+1

絶対パスのディレクトリに戻っ必要な接頭辞場合はopendir関数(故障のためのopendir確認...か死ぬべきだ「エラーメッセージ:$! ")。また、私は何かを逃していますか? Win32 :: GUI :: DoEvents()は何ですか? (私は質問に関連するものは何も表示されません) – Telemachus

+0

これは、私がやりたいと思っていない何かのための通常のexpresionsを覚えていないか、欲しいのではない最善の方法です。リスト($ dir 、 "f");ファイル "d"のディレクトリ、ありがとう投稿 – Geomorillo

11

それともFile::Find

use File::Find; 
finddepth(\&wanted, '/some/path/to/dir'); 
sub wanted { print }; 

が存在する場合には、サブディレクトリを通過します。

2

これは、あなたがディレクトリから(サブディレクトリを含む)すべての一覧を表示します順序で、および属性とともに指定します。私はこのことをするために何かを探していました。私はこの全体の議論から自分のものを少しずつ取り出してまとめました。楽しい!!

#!/usr/bin/perl -- 
print qq~Content-type: text/html\n\n~; 
print qq~<font face="arial" size="2">~; 

use File::Find; 

# find(\&wanted_tom, '/home/thomas/public_html'); # if you want just one website, uncomment this, and comment out the next line 
find(\&wanted_tom, '/home'); 
exit; 

sub wanted_tom { 
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($_); 
$mode = (stat($_))[2]; 
$mode = substr(sprintf("%03lo", $mode), -3); 

if (-d $File::Find::name) { 
print "<br><b>--DIR $File::Find::name --ATTR:$mode</b><br>"; 
} else { 
print "$File::Find::name --ATTR:$mode<br>"; 
} 
    return; 
} 
+3

アーヘ、私の目! – javs

3

あなたが私のようなスラッカーである場合は、File::Slurpモジュールを使用することができます。 read_dir機能意志は、配列にディレクトリの内容を読み込み、ドットを削除し、ファイルが

my @paths = read_dir('/path/to/dir', prefix => 1) ; 
関連する問題