2013-02-22 27 views
59

Tôi đang sử dụng Ứng dụng Windows Forms để theo dõi một thư mục và di chuyển các tệp đã bị bỏ trong thư mục đó sang một thư mục khác.Sử dụng FileSystemWatcher để theo dõi một thư mục

Hiện tại, nó sẽ sao chép tệp vào một thư mục khác, nhưng khi một tệp khác được thêm vào, nó sẽ kết thúc mà không có thông báo lỗi. Đôi khi nó sao chép hai tập tin trước khi kết thúc vào thứ ba.

Đây có phải là vì tôi đang sử dụng Ứng dụng biểu mẫu Windows thay vì ứng dụng bảng điều khiển không? Có cách nào tôi có thể ngừng chương trình từ kết thúc và tiếp tục xem thư mục không?

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
         | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    //Copies file to another directory. 
} 

Trả lời

85

Sự cố là bộ lọc thông báo. Chương trình đang cố mở một tệp vẫn đang sao chép. Tôi đã xóa tất cả các bộ lọc thông báo trừ LastWrite.

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastWrite; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 
20

Bạn đã không cung cấp xử lý mã tập tin, nhưng tôi giả sử bạn đã sai lầm cùng ai cũng làm khi lần đầu tiên viết một điều như vậy: sự kiện FileWatcher sẽ được nâng lên ngay sau khi tập tin được tạo ra. Tuy nhiên, nó sẽ mất một thời gian cho tập tin được hoàn thành. Lấy kích thước tệp 1 GB chẳng hạn. Các tập tin có thể được tạo ra bởi một chương trình khác (Explorer.exe sao chép nó từ một nơi nào đó) nhưng nó sẽ mất vài phút để hoàn thành quá trình đó. Sự kiện này được nâng lên vào thời gian tạo và bạn cần phải chờ tệp được sẵn sàng để sao chép.

Bạn có thể đợi tệp sẵn sàng bằng cách sử dụng chức năng this trong vòng lặp.

14

Lý do có thể là người quan sát được khai báo là biến cục bộ cho một phương thức và đó là rác được thu thập khi phương thức kết thúc. Bạn nên khai báo nó như là một thành viên của lớp. Hãy thử các cách sau:

FileSystemWatcher watcher; 

private void watch() 
{ 
    watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
         | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    //Copies file to another directory. 
} 
+9

Biến 'watcher' được giữ nguyên (không thu gom rác) vì anh đã đăng ký sự kiện Đã thay đổi. – adospace

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