簡體   English   中英

我如何使用 FileSystemWatcher 創建而不改變

[英]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 會觸發ChangeCreate事件。

例如,如果從命令提示符輸入:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM