首页 > 代码库 > [Perl系列—] 1. 清空目录及目录中的所有文件

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

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