2017-06-16 27 views
0

我试图在网络共享上创建一个监视文件夹,它只是将文件(300mb-20gb)大小复制到目标文件夹。 FileSystemWatcher和订阅对小文件(即1-3kb)非常有用。但是,较大的文件不会复制。我确实看到在详细流中触发了一个副本,但没有文件被复制到目标文件夹。Copy-Item不适用于FileSystemWatcher

$Folder = "\\10.11.233.91\vol_tx01\delivered_media" 
$Filter = "*.mxf" 
$destination = "C:\Users\Leeds TX 11\Desktop\support\Testy" 
$Watcher = New-Object IO.FileSystemWatcher $Folder, $Filter -Property @{ 
    NotifyFilter = [IO.NotifyFilters]'Filename, LastAccess' 
} 

$onCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier ` 
FileCreated -Action { 
    $path = $event.SourceEventArgs.FullPath 
    $name = $event.SourceEventArgs.Name 
    $ChangeType = $event.SourceEventargs.ChangeType 
    $Timestamp = $event.TimeGenerated 
    Write-Host "The file '$name' was $ChangeType at $Timestamp" 
    Copy-Item $path -Destination $destination -Force -Recurse -Verbose 
} 
+0

您在最后一次访问文件时触发,而不是最后一次写入文件。由于复制项目将访问该文件,我猜测这会导致它跳闸。在'NotifyFilter'中使用'LastWrite' .. – JohnLBevan

+1

谢谢John,我试着将LastWrite作为NotifyFilter。它仍然不会复制超过2-3kb的任何文件。 – user6705306

+0

另一个想法;触发上述脚本中的Copy-Item时是否只能看到此问题;或者在使用Copy-Item从同一个源到目的地时看到相同的问题?是那些工作和那些不是他们的文件大小之间的唯一区别?对不起,有这么多的问题;可悲的是,我还没有机会为自己测试你的代码,或者对FSW没有足够的了解,没有测试就发现任何问题。 – JohnLBevan

回答

2

问题的结合就在眼前。首先感谢JohnLBevan指出LastWrite应该是使用的notifyfilter。还发现在这种情况下,复制项目不会等待源目录中的文件传输关闭。我通过放入一个while循环来解决这个问题,等待文件被锁定:

##################### DANGER BOX #################################### 

    $Folder = "C:\Users\Leeds TX 12\Desktop\Source" #Source dir 
    $Filter = "*.mxf" # MXF Filter 
    $destination = "C:\Users\Leeds TX 12\Desktop\Destination" # Destination dir 



################### Watch for file system events########################### 

$Watcher = New-Object IO.FilesystemWatcher $Folder, $Filter -Property @{ 
NotifyFilter = [IO.NotifyFilters]'LastWrite, Filename' 
} 

################### Register filesystemwatcher & subscribe to notifyfilters ################# 

$onCreated = Register-ObjectEvent $Watcher Created -SourceIdentifier filecreated -Action { 
$path = $event.SourceEventArgs.FullPath 
$name = $Event.SourceEventArgs.Name 
$ChangeType = $Event.SourceEventargs.ChangeType 
$Timestamp = $event.TimeGenerated 
write-host "The file '$name' was $ChangeType at $Timestamp" # Debug 

################# Wait for file lock collapse ######################################### 

while($True) 
{ 
Try { 
     [IO.File]::OpenWrite($path).Close() 
     Break 
     } 
    Catch { Start-Sleep -Seconds 1} 
    } 

#################### Copy item ############################# 

Copy-item $path -Destination $Destination -force -Recurse -Verbose} 
+0

很高兴看到您找到解决方案。看起来这些人达到了相同的结论/这是一个常见问题:https://www.intertech.com/Blog/avoiding-file-concurrency-using-system-io-filesystemwatcher/。因此,我向Dot Net GitHub repo提交了一个问题(建议):https://github.com/Microsoft/dotnet/issues/437 – JohnLBevan

相关问题