• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

使用Perl的File::Path模块删除非空文件夹

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

之前写过用perl删除Windows下的图片缓存缩略图(Thumbs.db)

 

不过那个只是针对单个的文件,使用unlink方法就可以了(未测试过只读文件删除的情况- -!),那如果要删除指定的一个文件夹,有三种方案:

1、循环文件夹里面的文件,然后逐一删除,再使用rmdir删除空目录

2、使用File模块,使用remove_tree方法

3、调用系统命令进行删除(这个在linux下处理的较好,windows下未进行测试)

 

我选择了第二种方案,使用File::Path模块,点击查看详情>>

 

之前对Perl的操作符总结的并不好,这里小结一下:

1、比较运算符

2、逻辑运算符

特殊说明:操作符和其命名在运算时是完全等价的,但是有不同的优先级。操作符有更高的优先级。例如 && 比 and 有更高的优先级。

3、单引号与双引号的区别

示例一:

;
'test';

得到的将是字符串”$test”

示例二:

;
;

将得到变量$test的值 “11111”

 

好的习惯是全部使用双引号(”),在需要转义的地方使用”\”

 

 

上面是注意事项,回到写代码的初衷,为了删除某一指定文件夹下面的 “.svn”目录以及“Thumbs.db”文件。

#!/usr/bin/perl
use strict;
use warnings;
'remove_tree';
   5:  
;
   7: my $fileCount = 0;
   8: my $folderCount = 0;
   9:  
  10: sub del_handler {
  11:     my $path = $_[0];
  12:     my $handle;
  13:     my $subpath;
  14:  
if (-d $path) {
if (opendir($handle, $path)) {
while ($subpath = readdir($handle)) {
and !($subpath =~ m/^\.\.$/)) {
;
  20:  
if (-d $p) {
) {
;
  24:                           remove_tree($p);
  25:                           $folderCount++;
else {
  27:                             del_handler($p);
  28:                        }
) {
  30:                       unlink($p);
  31:                       $fileCount++;
;
  33:                     }
  34:                 }
  35:             }
  36:             closedir($handle);
  37:            }
  38:     }
  39: }
  40:  
  41: del_handler($path);
  42:  
;
;

 

上面的代码显示不太合理,因为把路径给写死了。如何在调用的时候,例如这样:perl del.pl path

就是path在调用的时候才传进去呢?用$ARGV[0] 就可以得到,调用之前判断一下。

#!/usr/bin/perl
use strict;
use warnings;
'remove_tree';
   5:  
   6:  
   7: my $fileCount = 0;
   8: my $folderCount = 0;
   9:  
  10: sub del_handler {
  11:     my $path = $_[0];
  12:     my $handle;
  13:     my $subpath;
  14:  
if (-d $path) {
if (opendir($handle, $path)) {
while ($subpath = readdir($handle)) {
and !($subpath =~ m/^\.\.$/)) {
;
  20:  
if (-d $p) {
) {
;
  24:                           remove_tree($p);
  25:                           $folderCount++;
else {
  27:                             del_handler($p);
  28:                        }
) {
  30:                       unlink($p);
  31:                       $fileCount++;
;
  33:                     }
  34:                 }
  35:             }
  36:             closedir($handle);
  37:            }
  38:     }
  39: }
  40:  
;
;
  43:  
  44: del_handler($path);
  45:  
;
;

使用方法(同样适用于linux)cmd切换到pl文件的目录,如c:\perlApp,C:\perlApp>perl del_svn.pl  C:\theme\defaultTheme\assets

 

当然删除文件和目录,使用windows自带的dos脚本更简单一些(存为bat双击运行即可):

echo off
   2: title 文件目录SVN标志清除工具
   3:  
   4: :start
   5: ::启动过程,切换目录
   6: set pwd=%cd%
   7: cd %1
echo 工作目录是:& chdir
   9:  
  10: :input
  11: ::获取输入,根据输入进行处理
  12: set source=:
  13: set /p source=确定要清楚当前目录下的svn信息吗?[Y/N/Q] 
  15:  
  22: goto input
  23:  
  24: :clean
  25: ::主处理过程,执行清理工作
  26: @echo on
  27: @for /d /r %%c in (.svn) do @if exist %%c ( rd /s /q %%c & echo     删除目录%%c)
  28: @echo off
  30: goto end
  31:  
  32: :noclean
  33: ::分支过程,取消清理工作
  35: goto end
  36:  
  37: :end
  38: ::退出程序



    
  40: pause

但有时间这个bat并不能很好的完成工作,非得到未删除干净的目录下再次运行,有点繁琐(为什么出现这种现象,暂时未查到原因~ ~)

 

DOS下还有一个Copy文件的命令也比较有用:xcopy,例如:

xcopy D:\Aptana_work\9917\search\*  \\192.168.0.178\application\search\search\   /E /Y /D

后面/E /Y /D是参数,具体的说明可以在DOS下查看

 

如果使用php或是python来删除文件夹和文件的话,也能做的很好,我只是当作练练手。下面是php代码,写的一个测试例子(代码规整的并不好,接触php不久..)

>
   2:  
   3: <?php
   4:     
function deleteDir($path) {
if (is_dir($path)) {
   7:             
'  开始遍历文件夹...<br/>';
   9:             
if ($handle = opendir($path)) {
false) {
  12:                     
) {
'/'.$file;
  15:                         
, $file)) {
  17:                             deleteHandler($path2);
  18:                             
if (is_dir($path2)) {
if (rmdir($path2)) {
'删除成功!<br/>';
else {
'删除失败!<br/>';
  24:                                 }
  25:                             }
if (is_dir($path2)) {
if (!rmdir($path2)) {
  28:                                 deleteDir($path2);    
  29:                             }                            
  30:                         }
  31:                     }
  32:                     
  33:                 }
  34:                 
  35:                 closedir($handle);
  36:             }
  37:             
else {

 
                    
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Perl教学函数集发布时间:2022-07-22
下一篇:
Perl语言的多线程(一)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap