簡體   English   中英

c#FileSystemWatcher Created事件未針對所有創建的文件觸發

[英]c# FileSystemWatcher Created event not firing for all files created

我想為目錄中創建的所有文件將文件信息插入數據庫。 如果我在目錄中放置少量文件,我的程序將執行此操作,但是如果一次在目錄中放置大量文件,則無法全部獲取(我沒有進行大量測試,但只插入了大約當我嘗試一次在目錄中刪除800個文件時,數據庫中有200個名稱)。

這是我的代碼:

static void Main(string[] args)
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = @"C:\dropDirectory";

    // Add event handlers.
    watcher.Created += new FileSystemEventHandler(OnChanged);

    // Begin watching.
    watcher.EnableRaisingEvents = true;

    while(DateTime.Now.Hour < 10);
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
    string strInsert = "INSERT INTO  Files (Filename) VALUES ('" + e.Name + "')";
    string strConnection = "Server = server_name; Database = database_name; User Id = user_id; Password = password;";
    using (SqlConnection con = new SqlConnection(strConnection))
    {
        using (SqlCommand cmd = new SqlCommand(strInsert, con))
        {   
            con.Open();
            cmd.ExecuteScalar();
        }
    }
}

我需要進行哪些更改,以便無論是否放置了多少文件,都將為目標目錄中放置的每個文件調用OnChanged方法? 提前致謝。

您的問題是緩沖區大小,以及它眾所周知且已記錄的問題

FileSystemWatcher使用帶有一些相關標志的ReadDirectoryChangesW WinApi調用

首次調用ReadDirectoryChangesW ,系統會分配一個緩沖區來存儲更改信息。 該緩沖區與目錄句柄相關聯,直到它被關閉並且其大小在其生命周期內保持不變。 在兩次調用此函數之間發生的目錄更改將添加到緩沖區中,然后在下一次調用時返回。 如果緩沖區溢出,則將丟棄緩沖區的全部內容

FileSystemWatcher中的類似物是FileSystemWatcher.InternalBufferSize屬性

備注您可以將緩沖區設置為4 KB或更大,但不能超過64 KB。 如果您嘗試將InternalBufferSize屬性設置為小於4096字節,則將丟棄您的值,並將InternalBufferSize屬性設置為4096字節。 為了獲得最佳性能,請在基於Intel的計算機上使用4 KB的倍數。

系統將文件更改通知組件,並將這些更改存儲在組件創建並傳遞給API的緩沖區中。 每個事件最多可以使用16個字節的內存 ,不包括文件名。 如果在短時間內有很多更改,緩沖區可能會溢出。 這將導致該組件無法跟蹤目錄中的更改 ,並且僅提供一攬子通知。 增加緩沖區的大小可以防止丟失文件系統更改事件。 但是,增加緩沖區大小是昂貴的,因為它來自無法調換到磁盤的非分頁內存,因此請保持緩沖區盡可能小。 為了避免緩沖區溢出,請使用NotifyFilter和IncludeSubdirectories屬性過濾掉不需要的更改通知

如果情況變得更糟,您可以混合使用輪詢和跟蹤,這使我幾次擺脫困境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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