2010-04-26 34 views

Trả lời

19

Tôi không nghĩ FSW hỗ trợ giám sát nhiều thư mục, vì vậy chỉ cần nhanh chóng một cho mỗi thư mục mà bạn muốn theo dõi. Bạn có thể trỏ các trình xử lý sự kiện theo cùng một phương thức, tuy nhiên, nó sẽ kết thúc hoạt động như tôi nghĩ bạn muốn.

0

Bạn có thể chỉ cần sử dụng nhiều trường hợp của các FileSystemWatcher, một cho mỗi thư mục?

12

Cách đơn giản nhất là tạo ra nhiều trường hợp của các đối tượng FileSystemWatcher.

http://www.c-sharpcorner.com/UploadFile/mokhtarb2005/FSWatcherMB12052005063103AM/FSWatcherMB.aspx

Bạn sẽ phải chắc chắn rằng bạn xử lý các sự kiện giữa hai thư mục một cách chính xác:

Mặc dù một số lần xuất hiện phổ biến, chẳng hạn như sao chép hoặc di chuyển một tập tin, không tương ứng với trực tiếp đến một sự kiện, những sự cố này xảy ra gây ra các sự kiện là được nêu ra. Khi bạn sao chép tệp, hệ thống sẽ tạo sự kiện đã tạo trong thư mục mà tệp được sao chép nhưng không tăng bất kỳ sự kiện nào trong thư mục gốc . Khi bạn di chuyển tệp , máy chủ sẽ tăng hai sự kiện: Sự kiện đã bị xóa trong thư mục nguồn, theo sau bởi sự kiện Đã tạo trong thư mục đích .

Ví dụ, bạn tạo hai trường hợp của FileSystemWatcher. FileSystemWatcher1 được đặt để xem "C: \ My Documents" và FileSystemWatcher2 được đặt để xem "C: \ Your Documents". Bây giờ, nếu bạn sao chép một tệp từ "Tài liệu của tôi" vào "Tài liệu " của bạn, sự kiện được tạo sẽ là do FileSystemWatcher2 nêu ra, nhưng không có sự kiện được nêu ra cho FileSystemWatcher1. Không giống như sao chép, di chuyển tệp hoặc thư mục sẽ tăng hai sự kiện. Từ ví dụ trước, nếu bạn di chuyển một tập tin từ " My Documents" thành "tài liệu của bạn", một sự kiện tạo sẽ được nâng lên bởi FileSystemWatcher2 và một sự kiện Deleted sẽ được nâng lên bởi FileSystemWatcher

Liên kết để FileSystemEventArgs

+0

Vì vậy, tôi có thể sử dụng cùng một phương pháp để xử lý cho cả các thư mục, nói như trong ví dụ dưới đây: FileWatcher [index] .Created + = new FileSystemEventHandler (OnCreated); Trong trường hợp trên, cách OnCreated() biết giá trị chỉ mục (hay đúng hơn là thư mục cần được theo dõi)? Cảm ơn. –

+0

@Bi Nếu tôi hiểu những gì bạn đang yêu cầu (ngày dài). Thông tin giám đốc sẽ được chuyển vào hàm OnCreated như một phần của tham số FileSystemEventArs. http://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs.aspx – kemiller2002

+0

Hoàn hảo - Cảm ơn! –

3

Ra khỏi hộp, FileSystemWatcher chỉ hỗ trợ giám sát một thư mục cha duy nhất. Để giám sát nhiều thư mục anh chị em, bạn cần tạo nhiều phiên bản của FileSystemWatcher.

Bạn có thể thử gian lận hành vi này, tuy nhiên, bằng cách tận dụng khả năng của FileSystemWatcher để bao gồm các thư mục con. Bạn có thể tạo điểm kết nối NTFS (còn gọi là liên kết tượng trưng) làm thư mục phụ từ thư mục bạn đang xem. Mark Russinovich của danh tiếng Sysinternals có một tiện ích gọi là Junction để đơn giản hóa việc tạo và quản lý các liên kết tượng trưng.

Lưu ý rằng bạn chỉ có thể tạo liên kết tượng trưng đến các thư mục trên máy cục bộ của mình.

1

Bạn sẽ phải khởi tạo nhiều phiên bản của đối tượng FileSystemWatcher. Mặc dù bạn có thể liên kết Sự kiện với cùng một phương thức và sử dụng đối tượng người gửi để xác định xem sự kiện nào đã kích hoạt sự kiện FileSystemWatcher.

 var fsw1 = new FileSystemWatcher(); 
     var fsw2 = new FileSystemWatcher(); 
     FileSystemEventHandler fsw_changed = delegate(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("{0} - {1}", (sender as FileSystemWatcher).Path, e.ChangeType); 
     }; 
     fsw1.Changed += fsw_changed; 
     fsw2.Changed += fsw_changed; 
0

hoặc bạn có thể vượt qua những con đường trong-mã, để đánh dấu một phạm vi nhất định của lĩnh vực theo dõi như thế nào trong này:

multiple monitor link

hy vọng điều này giúp.

+0

liên kết bạn trỏ đến để tạo đối tượng fsw mới cho mỗi đường dẫn. Không phải những gì op đang yêu cầu. –

2

Mặc dù đây là một câu hỏi cũ mà tôi quyết định trả lời, bởi vì tôi không thể tìm thấy câu trả lời hay ở bất cứ đâu.

Vì vậy, mục đích là giám sát nhiều thư mục (không phải thư mục con) bằng FileSystemWatcher? Dưới đây là gợi ý của tôi:

using System; 
using System.IO; 
using System.Security.Permissions; 
using System.Collections.Generic; 

namespace MultiWatcher 
// ConsoleApplication, which monitors TXT-files in multiple folders. 
// Inspired by: 
// http://msdn.microsoft.com/en-us/library/system.io.filesystemeventargs(v=vs.100).aspx 

{ 
    public class Watchers 
    { 
     public static void Main() 
     { 
      Run(); 

     } 

     [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
     public static void Run() 
     { 
      string[] args = System.Environment.GetCommandLineArgs(); 

      // If a directory is not specified, exit program. 
      if (args.Length < 2) 
      { 
       // Display the proper way to call the program. 
       Console.WriteLine("Usage: Watcher.exe PATH [...] [PATH]"; 
       return; 
      } 
      List<string> list = new List<string>(); 
      for (int i = 1; i < args.Length; i++) 
      { 
       list.Add(args[i]); 
      } 
      foreach (string my_path in list) 
      { 
       Watch(my_path); 
      } 

      // Wait for the user to quit the program. 
      Console.WriteLine("Press \'q\' to quit the sample."); 
      while (Console.Read() != 'q') ; 
     } 
     private static void Watch(string watch_folder) 
     { 
      // Create a new FileSystemWatcher and set its properties. 
      FileSystemWatcher watcher = new FileSystemWatcher(); 
      watcher.Path = watch_folder; 
      /* Watch for changes in LastAccess and LastWrite times, and 
       the renaming of files or directories. */ 
      watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
       | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
      // Only watch text files. 
      watcher.Filter = "*.txt"; 

      // Add event handlers. 
      watcher.Changed += new FileSystemEventHandler(OnChanged); 
      watcher.Created += new FileSystemEventHandler(OnChanged); 
      watcher.Deleted += new FileSystemEventHandler(OnChanged); 
      watcher.Renamed += new RenamedEventHandler(OnRenamed); 

      // Begin watching. 
      watcher.EnableRaisingEvents = true; 
     } 

     // Define the event handlers. 
     private static void OnChanged(object source, FileSystemEventArgs e) 
     { 
      // Specify what is done when a file is changed, created, or deleted. 
      Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); 
     } 

     private static void OnRenamed(object source, RenamedEventArgs e) 
     { 
      // Specify what is done when a file is renamed. 
      Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); 
     } 
    } 
} 
+3

FileWatcher triển khai IDisposable. Đề xuất của bạn sẽ được cải thiện bằng cách bao gồm mẫu để đảm bảo IDisposable.Dispose() được gọi nếu người xem không còn cần trước khi thoát chương trình (ví dụ: nếu một thư mục được theo dõi cụ thể bị xóa). –

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