gpt4 book ai didi

windows - 确定文件是否正在 Windows 上的 Perl 中使用

转载 作者:可可西里 更新时间:2023-11-01 13:29:05 24 4
gpt4 key购买 nike

我正在编写一些 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 作为 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";
}
}

使用 Adob​​e 阅读器打开 Dir100526Lt.pdf 的示例输出:

C:\Users\Greg\Downloads>check-lock.pl Dir100526Lt.pdf setup.exeDir100526Lt.pdf: in use by another processsetup.exe: available

请注意,无论何时您首先测试一个条件,然后根据该测试的结果采取行动,您都在创建一个 race condition .在您的应用程序中,最糟糕的情况似乎是以下不幸的顺序:

  1. 如上所述测试视频的可用性
  2. 回答:可用!
  3. 与此同时,录像机启动并锁定视频
  4. 回到您的程序,您尝试移动视频,但因共享违规而失败

关于windows - 确定文件是否正在 Windows 上的 Perl 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com