为什么Perl的File :: Copy似乎无声地失败?

时间:2009-07-22 20:11:14

标签: perl windows-server-2008 copy

我有一个适用于Windows XP的Perl脚本。 它使用File :: Copy的move函数将目录树移动到同一驱动器上的另一个位置。该脚本在Windows 2008上失败(无声)。没有任何移动,没有删除。

我正在使用ActiveState Perl 5.10.0 Build 1005以及随附的File :: Copy。

任何人都知道Windows 2008上的ActiveState Perl可能导致此问题吗?

示例脚本:

use File::Copy;
print "Move AAA to ZZZ\n";

move("AAA", "ZZZ");

print "Done.\n";

6 个答案:

答案 0 :(得分:12)

来自documentation

返回

所有函数在成功时返回1,在失败时返回0。 $!将被设定 如果遇到错误。

示例无声地失败,因为没有什么东西在检查$!失败了。试试这个:

move($from, $to) || die "Failed to move files: $!";

答案 1 :(得分:8)

如果您不想检查返回值,可以autodie为您执行此操作。

由于move()copy()返回零以表示错误,而autodie假设错误,所以它非常直接。

use strict;
use warnings;
use File::Copy;

use autodie qw'copy move';

move("AAA", "ZZZ"); # no need to check for error, because of autodie

print "Done.\n";

假设“AAA”不存在,则输出(STDERR)。

Can't move('AAA', 'ZZZ'): No such file or directory at test.pl line 7

答案 2 :(得分:2)

我自己也遇到过这种情况,在我的特殊情况下,尽管存在完全相同的错误(“没有这样的文件......”),实际上我有一个文件,从我重命名的层次结构深处,打开在某处的文本编辑器中。一旦我关闭该文件,错误就停止了。

答案 3 :(得分:1)

我在Windows上发生移动和删除文件时发生了奇怪的事情。解决方案是使用CPAN模块File::Remove

答案 4 :(得分:1)

我没有通过另外半打Perl模块寻找能够实现我想要的模块,而是采用了混合方法,并呼叫DOS使用“移动”命令。 DOS移动有其自身的特点。例如,如果将c:\ temp \ AAA复制到c:\ temp \ BBB并且BBB已经存在,则会得到c:\ temp \ BBB \ AAA。但是如果BBB还不存在,你得到c:\ temp \ BBB,下面没有AAA。为了避免这种情况,我首先创建BBB(如果它不存在),然后删除它。如果不存在,这将导致创建所有目录到BBB。

这是我的代码:

sub move($$) {
    my ($source, $target) = @_;

    if (! -d $source) {
        print "    ERROR: Source directory does not exist: $source. Not copying to $target.\n";
    }
    elsif (-d $target) {
        print "    ERROR: Target directory already exists: $target. Not copying from $source.\n";
    }
    else {
        $source =~ s|/|\\|g;
        $target =~ s|/|\\|g;
        my $results = `if not exist "$target" mkdir "$target" & rmdir "$target" & move /Y "$source" "$target"`;
        print "    Results of move \"$source\" \"$target\":\n $results\n";
    }
}

答案 5 :(得分:0)

我也发现move()和unlink()在最近10秒内创建的文件失败。我在move()之前添加了对'sleep 10'的调用,现在它可以工作了!奇怪但真实。

然后我发现了 http://answers.microsoft.com/en-us/windows/forum/windows_7-files/windows-7-does-not-refresh-folder-views/9d1ede23-2666-4951-b3b9-b6c1ce3d1ebf?page=23 这让我加入......

HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ LanmanWorkstation \参数

FileInfoCacheLifetime
FileNotFoundCacheLifetime
DirectoryCacheLifetime

当DWORD设置为0时......现在它可以暂停工作。但是无法保证对服务器性能的潜在影响。

这对我来说似乎是疯狂的默认行为,并且它不仅限于Perl!

另见Windows file share: why sometimes newly created files aren't visible for some period of time?