このブログを検索

2011/05/10

ファイル列挙

重複チェックにはhashを使うと簡単らしい。
後でやってみる。

browse_directory("c:\\mydoc\\");

sub browse_directory{
local($dir)=@_;
local(*DIR,$file);

if(!opendir(DIR, $dir)){
return;
}

while ($file = readdir(DIR)) {
if(($file eq ".") || ($file eq "..")){
next;
}
if (-d "$dir\\$file") {
browse_directory("$dir\\$file");
}else{
$file_size = -s "$dir\\$file";
$file_size{"$dir\\$file"} = $file_size;
$file_name{"$dir\\$file"} = $file;
}
}
closedir(DIR);
}

foreach $fullpath (sort {$file_size{$b} <=> $file_size{$a}} keys %file_size)  {
print "$fullpath,$file_size{$fullpath},$file_name{$fullpath}\n";
}


指定したディレクトリ配下のファイルについて、フルパス、サイズ、ファイル名を取得してサイズの降順に並べる。

しかしこれには不具合がある。たまたま、フォルダ名が「○○表」というフォルダがあった。これがフォルダとしてではなく、ファイルとして認識されてしまったのだ。回避方法はあるようだがメンドクサイし意味がわからない。

shift-jisはダメだな。「ヤカン」が「ポット」とマッチするという冗談みたいなことが起きる。

while(<>){
if(/ポット/){
print;
print " matched\n";
}else{
print;
print " unmatched\n"
}
}


このスクリプトに「ヤカン」という文字列を含むファイルを読ませると、マッチする。