Perl 删除单个文件和目录
Perl 删除单个文件的语法是: unlink
举例来说, 删除 D 盘 temp 目录下的 test.txt 的写法就是:
unlink "D:/temp/test.txt"
如果要删除这个目录中所有的文件的话(不包含子目录)
unlink glob "D:/temp/*"
Perl 删除单个目录的语法是:? rm
类似, 删除上面的temp 目录的写法就可以是:
rmdir "D:/temp"
看起来很简单, 但是需要注意的是:
1.? 如果目录下有文件的话,rmdir 就不能删除目录, 这个看起来很正常。
2.? 如果子目录下只有子目录的话, rmdir 也不能删除此目录。
3. uplink 只会删除当前目录下的文件, 对于子目录中的文件并不会删除。
4. 如果目录下没有文件的话, 执行uplink /* 会出错
所以要清空一个目录, 就要特别处理了。
删除目录中所有的内容, 包含它本身
解决方式就是递归循环子目录,依次删除下面的文件和目录。
需要完成的功能有:
1.? 得到目录中的文件
2. 得到目录的中子目录
3. 递归删除子目录及文件
代码
贴上代码
#******************************************************************************
# NAME: clear_folder_content
# DESCRIPTION: delete Folder content recursive,max deep is 100
# ARGUMENTS: 1. $folder_path
# 2. $delete_empty_folder: [1,0] 1==>delete empty folder
# 3. $log: [1,0] 1==> print delete info 0==>not print delete info
# AUTHOR: Oscar999
#******************************************************************************
sub clear_folder_content
{
my($folder_path,$delete_empty_folder,$log) = @_;
&clear_folder_content_recursive($folder_path,$log,0);
}
sub clear_folder_content_recursive
{
my($folder_path,$deep_length) = @_;
my @folder_files = &get_folder_files($folder_path);
my $folder_files_size = @folder_files;
if($folder_files_size>0)
{
my $delete_count = unlink glob "$folder_path/*" or die "can't clear folder:$folder_path. Reason: $! n";
print "Delete $delete_count files under $folder_path! n" if ($log==1);
}
my @sub_folders = &get_sub_floders($folder_path);
foreach(@sub_folders)
{
my $sub_folder = $_;
my $sub_folder_path = $folder_path."/".$sub_folder;
my $sub_deep_length = $deep_length +1;
if($sub_deep_length<100)
{
&clear_folder_content_recursive($sub_folder_path,$sub_deep_length);
}
}
if($delete_empty_folder==1)
{
rmdir $folder_path or die "can't remvoe $folder_path. Reason: $!n";
print "Delete folder: $folder_path! n" if ($log==1);
}
}
#******************************************************************************
# NAME: get_sub_floders
# DESCRIPTION: get sub Folders under a Folder
# ARGUMENTS: 1.Folder path
# AUTHOR: Oscar999
#******************************************************************************
sub get_sub_floders
{
my ($folder_path) = @_;
my @sub_floder_names;
$folder_path .= "/" unless($folder_path=~//$/);
#open Floder
opendir (FOLDER_PATH,$folder_path) or die "can't open directory $folder_path: $!";
my @file_list = readdir FOLDER_PATH;
closedir FOLDER_PATH;
my $file_name;
foreach (@file_list) {
$file_name = $folder_path.$_;
if($_ eq "." || $_ eq "..")
{
next;
}
push(@sub_floder_names,$_) if(-d $file_name) ;
}
return @sub_floder_names;
}
#******************************************************************************
# NAME: get_folder_files
# DESCRIPTION: get Files under a Folder
# ARGUMENTS: 1.Folder path
# AUTHOR: Oscar999
#******************************************************************************
sub get_folder_files
{
my ($folder_path) = @_;
my @file_names;
$folder_path .= "/" unless($folder_path=~//$/);
#open Floder
opendir (FOLDER_PATH,$folder_path) or die "can't open directory $folder_path: $!";
my @file_list = readdir FOLDER_PATH;
closedir FOLDER_PATH;
my $file_name;
foreach (@file_list) {
$file_name = $folder_path.$_;
if($_ eq "." || $_ eq "..")
{
next;
}
push(@file_names,$_) if(-f $file_name) ;
}
return @file_names;
}
调用方式:
&clear_folder_content("D:/temp",1,1);