我有一个适用于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";
答案 0 :(得分:12)
返回
所有函数在成功时返回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?