【发布时间】:2011-03-14 07:24:18
【问题描述】:
我正在编写一些 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;
}
这似乎可行,但我意识到可能有更好、更清洁的方法来做到这一点。
你能建议吗?
【问题讨论】:
-
这是一个很好的方法,我不相信你会找到很多选择......另一种方法是读取应用程序 pid 并在 pid 有后移动文件走了……
-
来自 Prix(我认为指出这一点很重要):如果文件正被全时使用且未释放,则无法对文件执行移动 [或删除],因为它会产生错误...。 (根据不同的文件模式设置,副本可能会起作用。)即使使用 stat 方法,您也必须仍然处理 FS 场景并仅将
file_in_use用作“提示”(尽管可能竞争条件可能永远不会在这里实现)。 -
@pst 是的,这就是为什么我认为 move 是一个很好的方法......因为如果文件仍然被锁定,它将返回 0 或告诉你一个错误,具体取决于你的编码方式你可以继续尝试,直到它被释放……
-
好点。我刚刚在我的原始逻辑中发现了一个致命缺陷,结果是“stat”的结果在录制过程中不会改变。所以我可以检查文件是否被锁定的唯一方法是重命名它并检查返回码。
-
实际上是因为文件正在被写入和锁定,而不是动态写入,它只创建并打开文件,记录完成后,关闭文件并更新数据文件。
标签: windows perl file winapi testing