为什么Perl的File::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";
已邀请:

hiure

赞同来自:

来自documentation

RETURN

All functions return 1 on success, 0 on failure. $! will be set if an error was encountered.
该示例默默地失败,因为没有什么是检查$!失败了。尝试这个:
move($from, $to) || die "Failed to move files: $!";

wnihil

赞同来自:

如果你不想检查返回值,你可以让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

xet

赞同来自:

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

lest

赞同来自:

我没有通过另外6个Perl模块来寻找一个做我想做的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";
    }
}

tiure

赞同来自:

我刚刚遇到了这个问题,在我的特殊情况下,尽管出现了完全相同的错误(“没有这样的文件...”),但实际上我有一个文件,从我正在重命名的层次结构的深处开始,编辑器的某处。只要我关闭该文件,错误就会停止。

xnobis

赞同来自:

我也发现move()和unlink()失败了在最近10秒内创建的文件。我在移动()之前添加了对'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 \系统\ CurrentControlSet \服务\ LanmanWorkstation \参数

FileInfoCacheLifetime
FileNotFoundCacheLifetime
DirectoryCacheLifetime
因为DWORD被设置为0 ...并且现在它没有停顿地工作。尽管如此,不能担保潜在的服务器性能影响。 这对我来说似乎是疯狂的默认行为,它并不限于Perl! 另请参阅Windows file share: why sometimes newly created files aren't visible for some period of time?

要回复问题请先登录注册