什么是删除目录的Perl方法,然后是所有空的 父目录,直到第一个非空目录?换句话说,可以使用什么而不是:
system 'rmdir', '-p', $directory;
Run Code Online (Sandbox Code Playgroud)
哪个,d首先删除d,然后c,然后b,但不是a,因为a仍然包含x,像这样:
a
a/b
a/b/c
a/b/c/d
a/x
Run Code Online (Sandbox Code Playgroud)
导致
a
a/x
Run Code Online (Sandbox Code Playgroud)
这不是内置的rmdir,因为它只能删除一个单一的目录.(doc)
它不是finddepth ( sub {rmdir}, '.' ),使用File::Find,因为它删除了孩子,而不是父母.(doc)
这也不是模块的remove_tree功能File::Path,因为它不仅删除子目录而且删除文件.(doc)
注意,remove_tree并finddepth在Bash的相反方向工作rmdir --parent.
use Path::Tiny qw( path );
my $p = path('a/b/c/d');
while (!$p->is_rootdir()) {
if (!rmdir($p)) {
last if $!{ENOTEMPTY};
die("Can't remove \"$p\": $!\n");
}
$p = $p->parent;
}
Run Code Online (Sandbox Code Playgroud)
笔记:
高效.通过检查结果rmdir而不是使用->children或->iterator,这个解决方案避免了不必要的调用readdir.
没有比赛条件.与使用readdir(通过->children或->iterator)的解决方案不同,此解决方案不会遇到竞争条件.
此解决方案还避免-d了早期解决方案使用的冗余检查.
与之前的解决方案不同,此解决方案将处理除了要删除的目录之外的空树.
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |