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,$delete_empty_folder,$log,0); } sub clear_folder_content_recursive { my($folder_path,$delete_empty_folder,$log,$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,$delete_empty_folder,$log,$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);
[Perl系列—] 1. 清空目录及目录中的所有文件,布布扣,bubuko.com
时间: 2024-10-11 13:11:42