如何在Windows下使用Path::Tiny的visit方法忽略权限错误?
解决Path::Tiny递归遍历遇不可访问目录时不终止程序的问题
在Windows Strawberry Perl 5.32.1环境中,Path::Tiny的visit方法默认会在opendir失败时抛出异常,导致整个遍历流程终止(比如遇到Documents and Settings这类特殊 junction 目录时)。要实现遇不可访问项目时跳过并继续遍历,可通过visit的preprocess参数自定义目录条目获取逻辑,捕获异常并跳过问题目录。
解决方案代码
use strict; use warnings; use Path::Tiny qw/path/; path(".")->visit( sub { print "Visiting $_[0]\n"; }, { recurse => 1, preprocess => sub { my ($dir) = @_; my @entries; # 捕获目录读取异常 eval { @entries = $dir->children; }; if ($@) { warn "跳过无法读取的目录 $dir: $@"; return (); # 返回空列表,跳过该目录的遍历 } return @entries; }, } ); print "Done (did not abort)\n";
原理说明
preprocess参数接收一个回调函数,会在visit准备遍历某个目录前调用,返回该目录下需要遍历的条目列表。- 手动调用
$dir->children获取子条目,并用eval包裹捕获读取异常:- 若读取成功,返回正常的子条目列表,继续遍历;
- 若读取失败,打印警告信息并返回空列表,
visit会跳过该目录的内容,继续处理其他目录。
这样修改后,程序遇到不可访问的目录时不会终止,会继续遍历其他正常的目录和文件,比如原示例中的Brother、Jts目录的内容会被正常访问。
内容的提问来源于stack exchange,提问作者jimav
相关产品推荐
相关产品推荐

