Whats cách tốt nhất để giám sát nhiều thư mục (không thư mục con) sử dụng FileSystemWatcher trong C#?Monitor nhiều thư mục sử dụng FileSystemWatcher
Trả lời
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.
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?
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
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.
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;
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:
hy vọng điều này giúp.
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. –
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);
}
}
}
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). –
- 1. Sử dụng FileSystemWatcher để theo dõi một thư mục
- 2. thư mục con Monitor với Java xem dịch vụ
- 3. Lỗi truy cập tệp bằng FileSystemWatcher khi nhiều tệp được thêm vào thư mục
- 4. FileSystemWatcher không hoạt động đúng khi nhiều tập tin được thêm vào thư mục cùng lúc
- 5. FileSystemWatcher - là Tập tin đã sẵn sàng để sử dụng
- 6. FileSystemWatcher hoạt động như thế nào trên một thư mục máy tính khác?
- 7. Tomcat - Nhiều thư mục webapps
- 8. FileSystemWatcher và windows 7
- 9. .NET filesystemwatcher - đó có phải là tệp hoặc thư mục không?
- 10. Makefiles trong nhiều thư mục
- 11. Tìm kiếm tệp trong thư mục có nhiều thư mục
- 12. Tôi cần sử dụng bộ lọc nào của FileSystemWatcher để tìm tệp mới
- 13. sass xem nhiều thư mục
- 14. Nhiều thư mục ứng dụng với Dancer perl
- 15. Cách sử dụng thư mục trong Codeigniter?
- 16. sử dụng "chạm" để tạo thư mục?
- 17. Lọc thư mục khi sử dụng shutil.copytree?
- 18. Monitor vs Mutex trong C#
- 19. Eclipse: Chỉ định nhiều thư mục res như chỉ định nhiều thư mục src
- 20. xem nhiều thư mục cho ứng dụng một expressjs
- 21. Chuyển đổi thư mục trong thư mục ảo sang Ứng dụng, sử dụng WIX
- 22. os.walk nhiều thư mục cùng một lúc
- 23. Qt QFileSystemModel - Nhiều cây thư mục trong chỉ mục gốc
- 24. FileSystemWatcher dưới chế độ xem đơn lẻ
- 25. Nhiều tệp trong một thư mục?
- 26. Tìm tất cả các thư mục con của thư mục Inbox sử dụng EWS
- 27. Nhiều git kéo trong một thư mục chứa nhiều kho
- 28. FileSystemWatcher để xem đường dẫn UNC
- 29. làm thế nào để sao chép nhiều file vào một thư mục sử dụng xcopy
- 30. Cách sử dụng mod_Rewrite để kiểm tra nhiều thư mục cho một tệp tĩnh
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. –
@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
Hoàn hảo - Cảm ơn! –