我正在尝试在朋友的机器上调试问题。 我写了一个脚本来复制一些文件,脚本使用mkpath(我知道mkpath是破旧的,现在有make_path,但我使用的是旧版本的perl)。
在我的计算机上(使用相同版本的perl和操作系统等),即使在目录已存在的情况下,脚本也能正常运行。
然而,
当我尝试在朋友的机器上运行脚本时,mkpath在已经存在的目录上调用时会抛出错误!
它抛出的错误是'mkdir:文件存在'
我很难理解为什么脚本可以在我的机器上运行而不是他的。
由于 法里德
好的,所以这里还有一些可以帮助诊断这个问题的事情
我们使用相同版本的Perl和File。两者都存储在Perforce存储库中,因此我们100%使用相同的版本
我正在将文件复制到网络共享系统。因此,文件路径的类型为:\\NETWORK-COMP/Directory1/Directory2/Directory3
脚本循环遍历一堆文件并将其复制。 第一个文件始终成功复制,但是在第二个文件中,它失败并显示错误
mkdir \ NETWORK-COMP / Directory1文件存在
Directory1不是文件,它实际上是一个GUID,没有碰撞(我每次都仔细检查过)!
答案 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/bar
,mkpath
将失败,并显示您所说的错误消息。
这可能是这种情况吗?在您的计算机上试用这个小型测试程序:
在两个系统上运行以下命令:
$ 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
其中一件事会让我们知道发生了什么。