【问题标题】:Why does Perl complain about "Unsuccessful stat on filename containing newline"?为什么 Perl 会抱怨“包含换行符的文件名不成功”?
【发布时间】:2011-02-08 18:48:59
【问题描述】:

我收到一个我不明白的错误。我正在使用 File:Find 在 Windows 上使用 Activestate Perl 5.8.8 递归文件系统并尝试统计 $File::Find::name;所以我不是stat-ing 从需要chomp-ing 或换行删除的文本文件扫描中获得的文件名。我无法获取文件修改时间,mtime in:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($File::Find::name);

试一试

-s $File::Find::name 

给我错误:

对包含换行符的文件名的不成功统计

找到的典型文件名是 F01-01-10 Num 0-00000.pdf 但即使在 E02.pdf

中重命名我也会遇到同样的错误

【问题讨论】:

  • 你为什么不试着咬一下看看。如果它有效,这意味着你的文件真的有一个换行符。

标签: windows perl


【解决方案1】:

根据perldiag,如果任何文件操作失败并且文件名恰好包含换行符,则会发出警告“文件名包含换行符失败”。

假设是,正如您所说,文件名来自标准输入或类似输入,并且用户忘记了chomp 换行符。无论如何,您可能想通过chomp 传递字符串,看看它是否有效。

some evidence &CORE::stat mtime 可能会被操作系统补丁级别和 ActiveState Perl 版本的某些组合破坏 - 建议的解决方法是使用 File::stat 模块,如下所示:

my $sb = stat($File::Find::name);
my $mtime = scalar localtime $sb->mtime;

...您可能会发现 File::stat 的对象表示比CORE::stat 返回的列表更方便。

【讨论】:

    【解决方案2】:

    即使我在尝试删除文件夹时也遇到了同样的错误。我在使用 rmtree 命令之前使用了 chomp。这解决了我的问题。

    【讨论】:

      【解决方案3】:

      在我的脚本中遇到了同样的问题,发现我的错误是当我创建文件时,我将日期标记标记到末尾,忘记在将 $DATE 变量添加到文件名之前对其进行筛选。

      【讨论】:

        【解决方案4】:

        是的,我自己用一个手工构建的标量遇到了这个问题。挠了挠头,直到我意识到我在文件名中包含了时间/日期戳。敲击日期命令,瞧,问题解决了。

        【讨论】:

        • 你确实意识到~完全相同的帖子已经在 2 年多前发布了,对吧?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 2012-12-22
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多