1,从命令行读取文件或者文件夹
2,支持无限多个文件或者文件夹参数,不分顺序
3,可以识别非法文件和文件夹,退出并提示
组合一:
FileDirHelper.pm
#!/usr/local/bin/perl
#Ljl
package FileDirHelper;
my ($size, $dircnt, $filecnt) = (0, 0, 0);
my @files;
my @AllDirs;
sub getAllFiles{
my $dir=shift;
lsr_s($dir);
print "Load $filecnt files, $dircnt directory. $size bytes.\n";
return @files;
}
sub getAllDirs{
my $dir=shift;
lsr_s($dir);
return @AllDirs;
}
sub getDirDetail{
my $dir=shift;
lsr_s($dir);
return ($size, $dircnt, $filecnt);
}
sub lsr_s($) {
my $cwd = shift;
my @dirs = ($cwd.'/');
my ($dir, $file);
while ($dir = pop(@dirs)) {
local *DH;
if (!opendir(DH, $dir)) {
warn "Cannot opendir $dir: $! $^E";
next;
}
foreach (readdir(DH)) {
if ($_ eq '.' || $_ eq '..') {
next;
}
$file = $dir.$_;
if (!-l $file && -d _) {
$file .= '/';
push(@dirs, $file);
}
process($file, $dir);
}
closedir(DH);
}
}
sub process($$) {
my $file = shift;
if(-f $file){
#print $file, "\n";
push @files,$file;
}else{
push @AllDirs,$file;
}
if (substr($file, length($file)-1, 1) eq '/') {
$dircnt++;
}
else {
$filecnt++;
$size += -s $file;
}
}
1;
AllFilesChecker.pl
#!/usr/local/bin/perl
#ljl
use Cwd;
use File::Basename;
use FileDirHelper;
if(scalar(@ARGV)<1){
print "Usage: Please input the RD path/file\n";
exit;
}
my @file;
for my $arg(@ARGV){
if(not -e "$arg"){
print "ERROR: ".$arg." is not right path or file!\n";
exit;
}
if(-f "$arg"){
push @file,$arg;
}else{
my @fileTemp = FileDirHelper::getAllFiles($arg);
push @file ,@fileTemp;
}
}
if(!-d "result"){
mkdir "result";
}
my $currPath = cwd();
my $outFile = $currPath.'/result/';
for my $file(@file){
my $fileCount=0;
my $filename=basename($file);
#my $baseName=substr($filename,0,index($filename,'.'.'txd'));
#open OUT ,">".$outFile.$baseName.'.txt';
print "[Read the file]: ".$filename."\n";
open FILE, $file or die "can not open the file ".$filename."\n";
while(<FILE>){
chomp;
print "\r\tProcess:".($fileCount++);
}
print "\n";
close FILE;
}
#open OUT ,">".$outFile."result.txt";
print "Finish! You can check the result files in :".$outFile."\n";
组合二:
FindAllFiles.pm
package FindAllFiles;
sub getfile{
my ($path,$expandName) = @_;
undef @allFiles;
my @allFiles=getFilesFromDir($path,$expandName);
return @allFiles;
}
sub getFilesFromDir{
my ($path,$expandName) = @_;
@allFiles;
opendir (PATH,"$path") or die "serious dainbramage:$!\n";
my @subAll = grep !/^\.\.?$/,readdir PATH;
closedir PATH;
foreach my $file(@subAll){
my $subPath = "$path\\$file";
if(-d "$subPath"){
&getFilesFromDir($subPath,$expandName);
} else {
if(-e "$subPath" and $subPath =~ /$expandName$/){
if($subPath=~/^(\\\\.*)(\\\\)(.*)$/){
$subPath = $1."\\".$3;
}
push @allFiles,"$subPath";
}
}
}
return @allFiles;
}
1;
AllFilesChecker.pl
use Cwd;
use File::Basename;
use FindAllFiles;
if(scalar(@ARGV)<1){
print "Usage: Please input the RD path/file\n";
exit;
}
my $fileType='txd';#注意文件类型
my @file;
for my $arg(@ARGV){
if(not -e "$arg"){
print "ERROR: ".$arg." is not right path or file!\n";
exit;
}
if(-f "$arg"){
push @file,$arg;
}else{
my @fileTemp = FindAllFiles::getfile($arg,$fileType);
push @file ,@fileTemp;
}
}
if(!-d "result"){
mkdir "result";
}
my $currPath = cwd();
my $outFile = $currPath.'/result/';
for my $file(@file){
my $fileCount=0;
my $filename=basename($file);
my $baseName=substr($filename,0,index($filename,'.'.$fileType));
print "[Read the file]: ".$filename."\n";
open FILE, $file or die "can not open the file ".$filename."\n";
while(<FILE>){
chomp;
print "\r\tProcess:".($fileCount++);
}
print "\n";
close FILE;
}
open OUT ,">".$outFile."result.txt";
print "Finish! You can check the result files in :".$outFile."\n";
print "*****************[Map Data]: The best group in the world! *******************\n";