2008-09-21 9 views
6

Tôi đang xây dựng một ứng dụng C# sẽ theo dõi một thư mục được chỉ định để thay đổi và bổ sung và lưu trữ thông tin trong cơ sở dữ liệu.Giám sát sửa đổi thư mục

Tôi muốn tránh kiểm tra từng tệp riêng lẻ để sửa đổi, nhưng tôi không chắc liệu tôi có thể hoàn toàn tin tưởng vào thời gian truy cập tệp hay không.

Phương pháp nào tốt nhất để sử dụng để nhận các tệp được sửa đổi gần đây trong một thư mục?

Nó sẽ chỉ kiểm tra các sửa đổi khi người dùng yêu cầu, nó sẽ không phải là dịch vụ chạy liên tục.

+0

Bạn có dịch vụ luôn chạy hay bạn muốn chương trình truy xuất các tệp đã sửa đổi gần đây trên mỗi lần chạy mà không phải theo dõi liên tục hệ thống tệp? Làm ơn, làm rõ câu hỏi. –

Trả lời

1

Hmm ... câu hỏi thú vị. Ban đầu tôi sẽ chỉ cho bạn ở lớp FileSystemWatcher. Tuy nhiên, nếu bạn muốn nó hoạt động theo yêu cầu của người dùng, thì có vẻ như bạn có thể cần lưu trữ thông tin thư mục ban đầu và sau đó so sánh mỗi khi người dùng yêu cầu. Tôi có thể đi với một FileSystemWatcher và chỉ cần lưu trữ ra kết quả của bạn dù sao đi nữa.

6

Sử dụng đối tượng FileSystemWatcher. Đây là một số mã để làm những gì bạn đang tìm kiếm.

 
    // Declares the FileSystemWatcher object 
    FileSystemWatcher watcher = new FileSystemWatcher(); 

    // We have to specify the path which has to monitor 

    watcher.Path = @"\\somefilepath";  

    // This property specifies which are the events to be monitored 
    watcher.NotifyFilter = NotifyFilters.LastAccess | 
     NotifyFilters.LastWrite | NotifyFilters.FileName | notifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; // Only watch text files. 

    // Add event handlers for specific change events... 

    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. 
    } 

    private static void OnRenamed(object source, RenamedEventArgs e) 
    { 
    // Specify what is done when a file is renamed. 
    } 
1

Nếu bạn chỉ cần kiểm tra khi người dùng hỏi thay vì mọi lúc, không sử dụng FileSystemWatcher. Đặc biệt nếu đó là một tài nguyên được chia sẻ - điều cuối cùng bạn muốn là 50 máy khách xem cùng một thư mục được chia sẻ.

Có thể chỉ là lỗi đánh máy, nhưng bạn không nên xem thời gian truy cập tệp, bạn muốn xem thời gian sửa đổi tệp để nhận thay đổi. Ngay cả điều đó cũng không đáng tin cậy.

Điều tôi sẽ làm là triển khai một số loại hàm kiểm tra vào ngày tệp và kích thước byte hoặc các thuộc tính hệ thống tệp khác. Bằng cách đó, tôi sẽ không tìm kiếm các thay đổi trong tệp hoàn chỉnh - chỉ các thuộc tính của nó và tôi có thể thực hiện theo yêu cầu, thay vì cố giữ kết nối đến một tài nguyên từ xa để theo dõi nó.

Giải pháp nặng hơn là thực hiện theo cách khác, và cài đặt dịch vụ trên máy lưu trữ ổ đĩa được chia sẻ có thể theo dõi các tệp và ghi lại các thay đổi. Sau đó, bạn có thể truy vấn dịch vụ thay vì chạm vào các tệp ở tất cả - nhưng có thể là quá mức cần thiết.