【问题标题】:FileSystemWatcher detect when file is moved to folderFileSystemWatcher 检测文件何时移动到文件夹
【发布时间】:2016-08-10 23:37:43
【问题描述】:

我在使用监视文件夹的脚本时遇到问题。 FileSystemWatcher 似乎只检测文件何时被复制到文件夹,而不是当它刚刚从同一个驱动器移动到它时。 有没有办法检测到这一点?

$desFolder   = "H:\Media"
$ExFolder    = "H:\Monitor"

$Filter       = '*.*'
$fsw = New-Object IO.FileSystemWatcher $ExFolder, $Filter 
$fsw.IncludeSubdirectories = $true

$fswOnChange = Register-ObjectEvent -InputObject $fsw -EventName Changed -SourceIdentifier FileUpdated -Action {
    $File =  Get-Item $EventArgs.FullPath
    if($File.Name -imatch '\.(?:mp4|mkv)$' -and $file.Name -match '.*?S\d+E+'){
        Start-Sleep -s 1
        if(Test-FileReady $File.FullName){
            Move-Files $File
        }
    }
}
function global:Test-FileReady {
    Param([parameter(Mandatory=$true)][string]$Path)
    if (Test-Path  -LiteralPath $Path) {
      trap {
        return $false
      }
      $stream = New-Object system.IO.StreamReader $Path
      if ($stream) {
        $stream.Close()
        return $true
      }
    }
}
function global:Move-Files{
    Param([parameter(Mandatory=$true)][System.IO.FileInfo]$File)
    Write-Host $File.Name
}

【问题讨论】:

  • 请出示您的代码。
  • 我添加了示例代码

标签: powershell move filesystemwatcher


【解决方案1】:

也尝试使用RenamedCreated 事件。

顺便说一句,IO.FileSystemWatcher docs 说:

组件不会监听指定目录,直到 Path 被设置,并且 EnableRaisingEvents 为 true

$fsw.EnableRaisingEvents = $true

【讨论】:

  • 'Created' 似乎适用于直接移入文件夹的已移动文件。但是,当包含文件的文件夹在目录中移动时,它只会在文件夹上触发,而不是其中包含的文件。我可以使用它,但有没有办法让它在文件夹中的每个文件上触发?
  • @FuSiOn,显然,移动文件夹是文件系统级别的一项原子操作,因此它只会触发一个事件。您必须手动枚举移动的文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多