2009-06-25 75 views

回答

65

如果你想獲得給定目錄的內容,只有它(即無子目錄),最好的辦法是使用執行opendir/readdir的/ closedir:

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

您還可以使用:

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

但在我看來,它也沒有那麼好 - 主要是因爲水珠是相當複雜的東西(可以自動過濾結果),並用它來獲取目錄中的所有元素似乎太簡單的任務。

在另一方面,如果你需要從所有的目錄和子目錄的獲取內容,基本上一個標準溶液:

use File::Find; 

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

exit; 

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

我總是忘記readdir只是返回一個相對文件名列表,而不是整個路徑! – 2014-08-04 07:15:07

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 2009-06-25 21:33:54

+0

這是我不希望或希望記住的東西經常expresions,應該是很容易做到的,我會用它來創建一個像列表中的函數($目錄的最佳方式,「F」);對於目錄文件「d」,感謝發佈這個 – Geomorillo 2014-03-03 06:41:39

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

如果你是像我這樣的懶人,你可能會喜歡使用File::Slurp模塊。該read_dir函數將讀取目錄內容到一個數組,消除了點,如果需要前綴的文件與目錄的絕對路徑

返回
my @paths = read_dir('/path/to/dir', prefix => 1) ; 
相關問題