[英]How can i use FileSystemWatcher created not change
我有一些關於 C# 的 FileSystemWatcher 的問題。
這是我的代碼如下。
private void MyFileSystemWatcher()
{
_watch = new FileSystemWatcher(path);
_watch.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size;
_watch.Filter = "*.*";
_watch.IncludeSubdirectories = true;
_watch.Changed += new FileSystemEventHandler(_watch_Changed);
_watch.Created += new FileSystemEventHandler(_watch_Created);
_watch.EnableRaisingEvents = true;
}
private void _watch_Changed(object sender, FileSystemEventArgs e)
{
Console.WriteLine("File changed: {0}", e.Name);
}
private void _watch_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("File created: {0}", e.Name);
}
當我將 book.txt 放到目錄中時,這就是我的結果。
File created: book.txt
File changed: book.txt
但這不是我預期的結果。 我希望它只是觸發創建的事件。
File created: book.txt
如何改進我的代碼。 我無法刪除更改的事件,我使用了另一種情況。
改變的事件說:
當對被監視目錄中的文件或目錄的大小、系統屬性、上次寫入時間、上次訪問時間或安全權限進行更改時,會引發 Changed 事件。
您監視文件夾並通過向其中添加新文件來更改其大小,因此您會收到事件通知。
因此,很自然地,當您在文件系統上來回移動文件時,您可能會得到一系列不同的事件。 你只需要閱讀你從事件中獲得的屬性並采取相應的行動。
我剛剛遇到了這個問題,這個頁面是第一個搜索結果 - 我知道這是一個較舊的問題,但由於沒有確定的答案,我會冒昧地添加我的解決方案。 我看到的具體行為是,在創建文件時,FileSystemWatcher 會觸發Change和Create事件。
例如,如果從命令提示符輸入:
echo test >foobar.txt
..然后我的 FSW 為 foobar.txt 的更改而觸發,然后是文件的創建。 雖然技術上是正確的,正如上面 Tigran 所解釋的,我真的只對向用戶呈現 Create 事件感興趣。
我的解決方案很簡單。 我創建了一個布爾標志來指示 FSW 事件處理程序是否已觸發,並在 Create 事件發生時將其設置為 TRUE。 我修改了 Change 事件處理程序,使其僅在標志設置為 false 時才采取行動。 換句話說,每個周期只處理一個事件(在我的例子中,當用戶點擊按鈕確認事件時,標志被重置)並且優先級被賦予 Create 事件。
我希望這可以幫助遇到同樣挑戰的其他人。
private bool isOnCreated = false;
.....
private void _watch_Changed(object sender, FileSystemEventArgs e)
{
if(isOnCreated)
isOnCreated = false;
else
Console.WriteLine("File changed: {0}", e.Name);
}
private void _watch_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("File created: {0}", e.Name);
isOnCreated = true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.