我正在编写一些 Perl,它获取 Windows Media Center 上录制的电视节目,并根据某些条件移动/重命名/删除它们。
由于 Perl 运行相当频繁,我想清楚地确定该文件是否正在使用(换句话说,节目正在录制过程中),这样我就可以避免用它做任何事情。
我当前的方法查看文件的状态(使用“stat”)并在 5 秒后再次进行比较,如下所示:
sub file_in_use
{
my $file = shift;
my @before = stat($file);
sleep 5;
my @after = stat($file);
return 0 if ($before ~~ $after);
return 1;
}
这似乎有效,但我意识到可能有更好、更干净的方法来做到这一点。
你能给些建议么?
如果录制过程锁定文件,您可以尝试以读写模式打开它,看看是否失败ERROR_SHARING_VIOLATION
as GetLastError
(通过 Perl 访问$^E
特殊变量)。
例如:
#! /usr/bin/perl
use warnings;
use strict;
sub usage { "Usage: $0 file ..\n" }
die usage unless @ARGV;
foreach my $path (@ARGV) {
print "$path: ";
if (open my $fh, "+<", $path) {
print "available\n";
close $fh;
}
else {
print $^E == 0x20 ? "in use by another process\n" : "$!\n";
}
}
输出示例Dir100526Lt.pdf
由 Adobe 阅读器打开:
C:\Users\Greg\Downloads>check-lock.pl Dir100526Lt.pdf setup.exe
Dir100526Lt.pdf: in use by another process
setup.exe: available
请注意,每当您第一次测试某个条件,然后根据该测试的结果采取行动时,您都在创建一个竞争条件。在您的应用程序中,最糟糕的情况似乎是以下不幸的顺序:
- 如上所述测试视频的可用性
- 答:可用!
- 与此同时,录像机启动并锁定视频
- 回到您的程序中,您尝试移动视频,但由于共享冲突而失败
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)