2009-06-02 29 views
13

Tôi đang sử dụng trình tải tệp .net 2.0 để xem thư mục chứa tệp mới. Nó hoạt động hoàn hảo trừ khi tôi đặt hơn 80 tập tin cùng một lúc. Sự kiện này không kích hoạt nữa. Nó giống như filewatcher được thiết lập để theo dõi một số lượng nhất định của các tập tin..Net FileWatcher không thành công cho ~ 80 + tệp

Hiện tại, tôi đã yêu cầu người dùng không đặt nhiều hơn 50 tệp cùng một lúc và dường như hoạt động tuy nhiên tôi muốn sửa nó để hàng trăm tệp có thể được thả vào thư mục cùng một lúc.

Đây là mã tôi đang sử dụng cho sự kiện. Đó là những thứ khá chuẩn không có gì lạ mắt.


FileWatcher = new FileSystemWatcher(); 
FileWatcher.Path = ConfigurationManager.AppSettings["FolderOfFilesToWatch"]; 
FileWatcher.NotifyFilter = NotifyFilters.FileName; 
FileWatcher.Filter = "*_*_*.*"; 
FileWatcher.Created += new FileSystemEventHandler(watcher_Created); 
FileWatcher.EnableRaisingEvents = true; 


static void watcher_Created(object sender, FileSystemEventArgs e) 
{ 
Console.Write(e.Name); 
} 

Bất kỳ ý tưởng nào?

+0

Xem [cân nhắc cho thay đổi tập tin trên hệ thống cao Khối lượng] (http: // MSDN. microsoft.com/en-us/library/ded0dc5s.aspx). –

Trả lời

14

Có thể bạn cần tăng FileSystemWatcher. InternalBufferSize. Theo mặc định, FileSystemWatcher sử dụng bộ đệm nhỏ hơn cho hiệu suất và có thể tràn nếu có quá nhiều thay đổi xảy ra trong một khung thời gian ngắn.

Thử đặt kích thước bộ đệm lớn hơn để ngăn không cho nó xuất hiện.

+2

Chỉ cần rất cẩn thận: theo MSDN: "Tăng kích thước bộ đệm là tốn kém, vì nó đến từ bộ nhớ không paged mà không thể được hoán đổi ra đĩa, vì vậy giữ bộ đệm càng nhỏ càng tốt. Để tránh tràn bộ đệm, hãy sử dụng NotifyFilter và các thuộc tính IncludeSubdirectories để lọc ra các thông báo thay đổi không mong muốn. " –

+0

@ocdecio: Có. Tuy nhiên, anh ta đã sử dụng NotifyFilter, vì vậy nó sẽ chỉ là vấn đề liệu anh ta có theo dõi các thư mục con hay không.Yêu cầu cụ thể của anh là theo dõi "hàng trăm" tệp, yêu cầu kích thước bộ đệm lớn hơn một chút so với kích thước mặc định 4k. –

2

Tôi sử dụng FileWatcher nhưng tôi đã sử dụng phương pháp "thắt lưng và treo". Bất cứ khi nào tôi nhận được một sự kiện FileWatcher tôi dính xung quanh và kiểm tra các tập tin tôi đã không nhìn thấy trước đây (trong trường hợp của tôi tôi có một danh mục tập tin). Tin tôi đi, sẽ có một khoảng thời gian khi bạn nhận được hàng ngàn tệp bị bỏ trong một thư mục và bạn phải có một biện pháp bảo vệ khác để giải thích cho tất cả chúng.

Một thay đổi khác mà bạn có thể xem là change journals, mặc dù nó là (AFAIK) giới hạn ở các đĩa được gắn vào máy của bạn, trong khi bạn có thể sử dụng FileWatcher để xem đường dẫn UNC.

1

Có thể bạn đang vượt quá số lượng ThreadPool của hệ thống. Khi FileSystemWatcher kích hoạt một sự kiện, nó thực hiện như vậy từ một luồng được lấy ra từ nhóm này. Có thể mất các sự kiện này nếu bạn không có đủ luồng được phân bổ cho ThreadPool của bạn.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

Như những người khác, đặc biệt là, 'ocdecio' đã ghi nhận nó là tốt không hoàn toàn tin tưởng vào FileSystemWatcher. Nó là nổi tiếng không phù hợp dưới tải trọng nặng.

0

tin rằng cổ phiếu CIFS có tự mình cài đặt một số cài đặt mà bạn cần chú ý hay không. 50 dường như là giá trị mặc định cho hầu hết các lệnh chia sẻ tập tin (tôi không biết đủ về điều này để biết bất kỳ điều gì khác ngoài cụm từ ... xin lỗi)

Dù sao - vấn đề này đã khiến chúng tôi lo lắng - và may mắn nhà cung cấp dịch vụ lưu trữ của chúng tôi đủ tốt để đầu tư cho chúng tôi vào vấn đề này.

Đi một peek đây và xem nếu điều này có thể giúp bạn vượt qua sự kỳ diệu 50 ...

http://support.microsoft.com/kb/810886

Các vấn đề liên quan