You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:13:20