【问题标题】:mkpath failing if directory already exists?如果目录已经存在,mkpath 会失败吗?
【发布时间】:2011-09-02 19:38:06
【问题描述】:

我正在尝试调试朋友机器上的问题。 我编写了一个脚本来复制一些文件,该脚本使用了mkpath(我知道 mkpath 已经过时了,现在有了 make_path,但我使用的是旧版本的 perl)。

在我的机器上(使用 相同 版本的 perl 和操作系统等),即使在目录已经存在的情况下,脚本也可以正常运行。

然而,

当我尝试在朋友的机器上运行脚本时,mkpath 在已存在的目录上调用时会抛出错误!

它抛出的错误是'mkdir : File exists'

我很困惑为什么脚本在我的机器上可以运行,但在他的机器上却不行。

谢谢 法里德

编辑添加更多有用的信息

好的,这里还有一些东西可以帮助诊断这个问题

  1. 我们使用相同版本的 Perl 和 File。两者都存储在 Perforce 存储库中,因此我们 100% 使用相同的版本

  2. 我正在将文件复制到网络共享系统。因此文件路径的类型为:\\NETWORK-COMP/Directory1/Directory2/Directory3

  3. 脚本循环遍历一堆文件并将它们复制过来。 第一个文件总是成功复制,但是第二个文件失败并出现错误

    mkdir \NETWORK-COMP/Directory1 文件存在

Directory1 不是文件,它实际上是一个 GUID,没有冲突(我每次都仔细检查)!

【问题讨论】:

  • 你在两台机器上使用相同版本的 File::Path 吗?
  • 它们不是基于 Perl 的版本吗?我们使用的是相同版本的 perl
  • File-Path 是双活发行版,因此可以独立于perl 进行升级。
  • 我从存储库 (Perforce) 采购 Perl,我们都同步到同一个存储库和版本
  • mkdir \NET... 缺少 \

标签: windows perl


【解决方案1】:

我怀疑部分路径存在,但它不是目录。

$ echo foo >foo

$ perl -MFile::Path -e'mkpath "foo"'
mkdir foo: File exists at -e line 1

另一种可能是两台机器的 File::Path 版本不同,其中一台机器有 bug。如果是这样,您可以升级File-Path


第三种可能性是您在其中一台机器上输入错误。我明白了

mkdir PATH: File exists

但你得到了

mkdir : File exists

这可能是因为版本不同,但我不这么认为,因为“:”前面有空格。使用Data::Dumper(在执行$Data::Dumper::Useqq = 1; 之后)检查您的输入,以确保您通过了您认为您通过的内容。

【讨论】:

  • 我从存储库 (Perforce) 采购 Perl,我们都同步到同一个存储库和版本
  • @Setheron,我给出的另一个可能的原因如何?
  • @Setheron,添加了第三个可能的原因。
  • 抱歉,我得到 mkdir PATH: File exists,但为什么它可以在我的机器上运行而不是我的朋友?值得注意的是文件在网络机器上
  • 所以目录类似于:“\\NETWORK-COMP/Directory1/Directory2”
【解决方案2】:

相同的操作系统?相同版本的 Perl?嗯……

当它尝试创建的路径中存在现有文件时,我看到了此错误消息。比如我尝试创建目录foo/bar/bar/foo,但是有一个文件foo/bar/barmkpath会失败,出现你说的错误信息。

有没有可能是这种情况?在你的电脑上试试这个小测试程序:

在两个系统上运行以下命令:

$ perldoc -lm File::Path

这将打印出被包含的 File::Path 模块的位置。我怀疑您没有执行您认为的 File::Path 模块。

确定实际使用的模块后,检查两个模块是否一致。此外,当您使用它时,请执行perl -V(这是一个大写字母V)。这将为您提供有关您的 Perl 安装的大量信息,包括使用 libpath、posix。很有可能您使用相同的源代码编译 Perl,但编译标志不同。

在两个系统上试试这个测试程序:

use strict;
use warnings;
use File::Path;

open (FOO, ">foo") or die qq(Things really aren't going your way\n);
print FOO "THIS\n";
close FOO;

if (my $value = mkpath "foo/foo/bar/foo") {
    print "It worked: $value !\n";
} else {
    print "It didn't: $value !\n";
}
print "And the program continues\n";

这个应该失败,因为我正在创建一个文件foo,然后尝试创建一个路径foo/boo/bar/foo。事实上,我得到以下错误:

mkdir foo: File exists at ./test.pl line 11

其中一件事情会给我们一个线索。

【讨论】:

  • 太棒了。我会在星期二试试这些东西! (星期一是劳动节)=)
猜你喜欢
  • 2014-10-08
  • 2012-01-23
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2014-08-29
  • 2011-07-06
相关资源
最近更新 更多