2011-01-11 57 views
2

我在本地文件系統目錄中設置了一個FsWatcher。我只想知道何時將文件添加到目錄中,以便可以將它們移動到另一個文件系統。我似乎能夠檢測第一個文件何時進入,但實際上我想知道何時完成了給定複製操作中的所有文件。FileSystemWatcher工作已完成?

如果我使用Windows資源管理器將文件從一個目錄複製到另一個目錄,資源管理器會告訴我傳輸中還剩下n秒鐘,因此雖然每個文件的開始傳輸和結束傳輸都有一些活動,似乎對於所有文件的開始傳輸和結束傳輸都是有用的。

我不知道是否有類似的東西,我可以使用.NET框架。我想知道什麼時候「所有」文件都在,而不是「交易」中的單個文件。如果沒有烘焙的東西,也許我應該想出一些等待/反擊,以便在工作「完成」時只做我的活動。

不知道如果我對此有100%的認識,請任何人評論。

感謝。

+0

對我有意義。如果要將一組文件複製到某個目錄,則不需要在將每個文件複製到該目錄時處理這些文件。您希望等到組中的所有文件都被複制後再採取措施。 – Tester101 2011-01-11 21:40:30

回答

3

我過去實現這個的方式是使用一個帶有特殊名稱的「標記」文件,例如, '結束'。該文件總是寫入的最後一個文件,並用作多文件事務完成時間的指示符。如果只有一個正在寫這些文件集的線程,這將工作得很好。

如果有許多線程,其中每個線程可能正在寫一組文件,那麼您需要以某種方式將每個「結束」文件與它所標記的文件集相關聯。一種方法是在文件名中包括一個GUID(或一些其他的唯一標識符),例如,

{GUID1 .file1.bin,GUID1 .file2.bin,GUID1 .END}

{GUID2 .file1.bin,GUID2 .file2.bin,GUID2 .end}

另一種方法是將每個文件集中的所有文件壓縮成一個ZIP文件,這樣您只需要監視單個文件。

1

有沒有這樣的事情作爲文件複製的交易。您只能監視目錄中的單個文件更改。

資源管理器可以這樣做,因爲它知道你想要做什麼(將這些x文件從這裏複製到這裏)。

你甚至不知道什麼時候編寫(或更一般地修改)這個文件完成。您必須嘗試專門鎖定文件,以便您知道您是唯一訪問該文件的人。

AdamRalph提到的.end文件技巧實際上是您接近您想要做的唯一技巧。

心連心

馬里奧

0

怎樣編寫指示的文件列表中的文件被添加作爲第一步,你的應用程序把它撿起,讀取它,然後等待上要寫入的文件。當最終文件被寫入時,您可以打包併發送它們。這樣,如果啓動了多個「交易」,則沒有「結束文件」踩在彼此的腳趾上。給指標文件一個已知的模式名稱,以查找在常規文件中不太可能發生的情況,並提供一些可以在相似時間發生多個指示器文件的方法。

如果我要實現像這樣的東西,我可能會使用某種文件名,如~<ANOTHER-UNIQUE-GUID>.tmp我的文件系統監視器將監視該格式名稱的單個文件,這反過來告訴另一個文件系統監視器等待文件列在裏面。當文件被移出時,臨時文件可以被刪除。

這種方法可以很容易地進行線程化,這樣您的每個觀察者都不會彼此跨越並傳輸/刪除其他觀察者正在處理的文件。

如前所述,將文件壓縮成單個壓縮文件並使用該壓縮文件可能更有效,並將其解壓縮到目標位置。

+1

你對多個寫作線程的可能性做了一個好點。我已經更新了我的答案,並提出了使用「最終」文件解決方案處理此問題的建議。你的建議肯定會奏效,但我寧願避免實際打開標記文件並閱讀它的內容。如果提供了一個不完整的集合,那麼您將不得不處理可能的故障,並且您可能需要提供一個超時時間,以便您的組件不會因未完成集合而「等待」。使用「最終」解決方案,您不關心文件夾中的任何文件,直到「結束」文件存在。 – 2011-01-11 21:55:45