【问题标题】:mkpath File::Path does not seem to work as expectedmkpath File::Path 似乎没有按预期工作
【发布时间】:2014-11-09 02:55:54
【问题描述】:

我正在使用 mkpath 创建一个目录。

mkpath('/home/myhome') or die "Create of directory  failed: $!";

如果目录不存在,则此方法有效,但如果存在,则失败。 从 perldocs 中它说它类似于 mkdir -p unix。但是,如果目录已经存在,该命令不会失败。

我应该注意什么才能安静地创建具有多个路径的目录? v5.8.8

【问题讨论】:

  • 我很在乎。我只想为已经存在的目录停止错误。我知道我总是可以围绕它编写代码,但是如果有另一个函数或方法已经有这个......

标签: perl file dir


【解决方案1】:

mkpath 出错时会抛出异常,因此您需要以下内容:

mkpath('/home/myhome');

如果您想要自定义消息,可以使用以下内容:

eval { mkpath('/home/myhome'); 1 }
   or die "Can't create home directory: $@\n";

注意使用$@,而不是$!

【讨论】:

    【解决方案2】:

    doc 说:

    函数返回实际创建的目录列表 通话;在标量上下文中创建的目录数。

    正如 ikdegami 指出的那样,下一个错误处理将不起作用

    mkpath($path) or print "Error creating $path\n" unless -d $path;
    

    因为 mkpath 会因致命错误而发牢骚。 (使用Carp),所以它会尽快终止执行,因为可以打印错误消息。

    ... 除非 mkpath 的执行被困在 eval 块中。 (见ikegami's anser

    使用 eval 捕获只会返回一个错误。例如:

    eval { mkpath($p2, $p3); 1 } or die "Can't create home directory: $@\n";
    

    如果 $p1$p2 都失败 - 不会报告所有错误。要打印出所有错误,您可以使用自定义变量来存储诊断消息,请参阅文档的 ERROR HANDLING 部分

    在这种情况下,mkpath 不会呱呱叫,如果发生致命错误,将返回成功创建的目录数(在标量上下文中),如:

    mkpath($path1, $path2 , {error => \my $err});
    

    来自文档:

    注意,如果没有遇到错误,$err 将引用一个空的 大批。这意味着 $err 总是以 TRUE 结束;所以你需要 测试@$err 以确定是否发生错误。

    您可以将它们全部打印出来,请参阅文档中的示例。

    【讨论】:

    • 我喜欢除非我的如果。
    • 所以我仍然必须将调用包装在 if -d $path 中。如果存在,请不要尝试在 eval 块中创建。 if (!(-d $path)) { mkpath($path) #just use mkpaths error }
    • @Paul 最简单的方法就是 ikegami 的回答。只接受他的回答。 ;)
    猜你喜欢
    • 2020-09-15
    • 2016-01-24
    • 1970-01-01
    • 2022-12-17
    • 2021-06-07
    • 2013-02-10
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多