Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如果目录已存在,mkpath是否失败?_Windows_Perl - Fatal编程技术网

Windows 如果目录已存在,mkpath是否失败?

Windows 如果目录已存在,mkpath是否失败?,windows,perl,Windows,Perl,我正在调试一个朋友机器上的问题。 我编写了一个脚本来复制一些文件,该脚本利用了(我知道mkpath已经过时,现在有make_path,但我使用的是旧版本的perl) 在我的机器上(使用相同版本的perl和操作系统等),即使在目录已经存在的情况下,脚本也可以正常运行 但是, 当我尝试在我朋友的机器上运行脚本时,在已经存在的目录上调用mkpath时会抛出一个错误 它抛出的错误是“mkdir:File exists” 我很困惑,为什么脚本可以在我的机器上运行,而不能在他的机器上运行 谢谢 法里德 编辑

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

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

但是,

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

它抛出的错误是“mkdir:File exists”

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

谢谢 法里德

编辑并添加更多有用的信息 好的,这里还有一些东西可以帮助诊断这个问题

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

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

  • 脚本在一堆文件中循环并复制它们。第一个文件始终被成功复制,但在第二个文件上,复制失败并出现错误

    mkdir\NETWORK-COMP/Directory1文件存在


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

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

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

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


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

    mkdir PATH: File exists
    
    但是你得到

    mkdir : File exists
    

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

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

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

    有可能是这样吗?在您的计算机上尝试此小测试程序:

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

    $ 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
    

    其中一个问题将告诉我们发生了什么。

    您在两台机器上使用的是相同版本的File::Path吗?它们不是基于Perl版本吗?我们使用的是同一版本的perl,它是一个双生存发行版,因此它可以独立于
    perl
    进行升级。我从存储库(Perforce)获取perl,我们都同步到同一个存储库,而verion
    mkdir\NET…
    缺少一个
    \
    。我从存储库获取perl(Perforce)我们都同步到同一个存储库verion@Setheron,那么我给出的另一个可能的原因呢?@Setheron,添加了第三个可能的原因。对不起,我得到了mkdir路径:文件存在,但为什么它在我的机器上工作而不是在我的朋友上?值得注意的是,该文件位于网络计算机上,因此目录类似于:“\\network-COMP/Directory1/Directory2”。星期二我要试试这些东西!(星期一是劳动节)