加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[Perl系列—] 1. 清空目录及目录中的所有文件

发布时间:2020-12-15 23:57:20 所属栏目:大数据 来源:网络整理
导读:Perl 删除单个文件和目录 Perl 删除单个文件的语法是: unlink 举例来说, 删除 D 盘 temp 目录下的 test.txt 的写法就是: unlink "D:/temp/test.txt" 如果要删除这个目录中所有的文件的话(不包含子目录) unlink glob "D:/temp/*" Perl 删除单个目录的语

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读