如果目录已存在,则mkpath失败?

时间:2011-09-02 19:38:07

标签: windows perl

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

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

然而,

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

它抛出的错误是'mkdir:文件存在'

我很难理解为什么脚本可以在我的机器上运行而不是他的。

由于 法里德

编辑添加更多有用的信息

好的,所以这里还有一些可以帮助诊断这个问题的事情

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

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

  3. 脚本循环遍历一堆文件并将其复制。 第一个文件始终成功复制,但是在第二个文件中,它失败并显示错误

    mkdir \ NETWORK-COMP / Directory1文件存在

  4. Directory1不是文件,它实际上是一个GUID,没有碰撞(我每次都仔细检查过)!

2 个答案:

答案 0 :(得分: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;之后)以确保您传递的是您认为传递的内容。

答案 1 :(得分:1)

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

当我尝试创建的路径中存在现有文件时,我看到了此错误消息。例如,我尝试创建目录foo/bar/bar/foo,但是文件foo/bar/barmkpath将失败,并显示您所说的错误消息。

这可能是这种情况吗?在您的计算机上试用这个小型测试程序:

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

$ perldoc -lm File::Path

这将打印出包含的File :: Path模块的 location 。我怀疑你没有执行你认为的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

其中一件事会让我们知道发生了什么。