【问题标题】:How to determine if a file or directory is in use or not?如何确定文件或目录是否正在使用?
【发布时间】:2019-05-07 02:32:31
【问题描述】:

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

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

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

有人有更好的主意吗?

【问题讨论】:

  • 至于这个 --- “我正在编写一个脚本,用于监视下载文件夹中已完成的项目,并在发现时开始处理该项目。” --- 你不是在说,展示你是如何做到这一点的,这可能是所有这些额外努力的根本原因。您是使用自己的自定义代码,还是使用 Bits Transfer 模块/cmdlet?位具有指示完成的参数。 - Get-Command -Name 'bits'
  • 浏览器不会在下载文件时锁定文件。该文件无效/序列化足以被任何东西打开,当然浏览器不会测试完整的下载.. 大多数下载,在下载过程中创建一个临时文件,然后根据下载方式获得它的名称被要求。当下载失败或由于某种原因损坏时会发生什么?

标签: powershell powershell-4.0


【解决方案1】:

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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2011-04-29
    相关资源
    最近更新 更多