[英]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.