2012-09-04 50 views
0

是這樣的,每次FileSystemWatcher的會產生3事件當一個文件被拷貝到FileWatcher文件夾FileSystemWatcher的 - 文件複製過程中3個事件

例子:我得到創建 - >更改 - >更改(中新文件)或更改 - >更改 - >更改(在覆蓋現有文件期間)事件時,使用File.Copy(source,watcherFolder,true)將文件複製到FileWatcher文件夾時。

當複製不同大小的文件(1kb,67kb,100MB,500MB,1GB文件)時,會獲得3個事件。我註冊了FileSystemWatcher中的創建和更改事件

+0

是的,FileSystemWatcher會告訴您關於特定寫入文件的更改事件。如果這不是您想要的,請提供更多詳細信息。 –

回答

2

如果您的問題是關於您收到的多個事件,這是一個正常行爲。文件複製可以引發多個事件。

您可以檢查FileSystemEventArgs.ChangeType中的更改並忽略一些事件。這裏是WatcherChangeTypes Enumeration

看看FileSystemWatcher備註。

關於Created事件,它將在目標文件夾中引發。

例如,您創建兩個FileSystemWatcher實例。 FileSystemWatcher1設置爲觀看「C:\ My Documents」,並將FileSystemWatcher2設置爲觀看「C:\ Your Documents」。如果您將文件從「我的文檔」複製到「您的文檔」中,則FileSystemWatcher2會創建一個創建的事件,但FileSystemWatcher1不會引發事件。與複製不同,移動文件或目錄會引發兩個事件。在前面的例子中,如果您將文件從「我的文檔」移動到「您的文檔」,FileSystemWatcher2將引發Created事件,FileSystemWatcher1引發一個Deleted事件。

+0

當一個文件被複制到文件觀察器文件夾時,我如何識別文件是否完全複製到文件觀察器文件夾中? – snober

+0

編輯我的答案:您必須觀看目標文件夾(即文件複製到的目錄)上的創建事件。 – JoeBilly

+0

@Snober測試文件是否被鎖定 - 如果您不知道如何發佈代碼。但不在評論中 –

1

正如在評論中提到的,您應該查找正在創建的文件,然後嘗試文件鎖定以確定它是否被完全複製。

while ($true) 
    { 
     try{ 
      [IO.file]::openwrite("<insert file path>").close() 
      break 
     } 
     catch { start-sleep -Seconds 60 } 
    } 
0

如果你在文件複製操作的控制,一個簡單的事情做的是一個臨時名稱創建該文件,一旦被複制重命名。讓FileSystemWatcher觀看Rename事件。這個事件只被解僱一次。