如何判断文件或目录是否正在使用?

How to determine if a file or directory is in use or not?

我正在开发一个脚本,用于监控 downloads 文件夹中的已完成项目,并在找到后开始处理该项目。

我目前的检测方法尝试重命名子目录,如果成功则认为完成。对于单个文件,它会尝试将文件移动到名为 \filename\filename.ext 的子目录中,如果成功则假定完成。这与已知临时文件列表一起。

虽然此方法在 file/dir 确实在使用或未使用时可能是准确的,但它可能不适用于某些在等待恢复时不锁定文件的浏览器或下载器。仅在 xx 天前还检查日期和进程的版本并不理想,因为所有下载都会延迟。

有人有更好的主意吗?

This post建议可以打开一个文件进行写入,看是否被锁定:

$file = "\xxxx\xxxxx\xxxxxxxx\test.log"
try { [IO.File]::OpenWrite($file).close();exit 0 } catch { exit 999}

我没有注意到浏览器会让文件处于解锁状态,但我看到它们会选择一个备用名称(*.part 或 *.partial)直到下载完成。可能值得使用检查文件扩展名的逻辑,直到它不是 .part:

Push-Location 
do{
  Sleep 1
}while((Get-ChildItem (join-path $env:USERPROFILE 'Downloads\*.part*')).Length -gt 0)