2009-04-17 33 views
28

Khi thay đổi được thực hiện trong một thư mục trên hệ thống Windows, tôi cần một chương trình để được thông báo ngay lập tức về thay đổi.Làm cách nào để theo dõi thư mục Windows để thay đổi?

Có cách nào thực hiện chương trình khi có thay đổi không?

Tôi không phải là lập trình viên C/C++ /. NET, vì vậy nếu tôi có thể thiết lập thứ gì đó để thay đổi có thể kích hoạt tệp hàng loạt thì điều đó sẽ lý tưởng.

+0

Có thể thực hiện với VBScript và WMI, xem việc triển khai này http://www.go-geek.com/tips-n-tricks/monitor-directory-for-new-files-with-wsh.html – Pradeep

Trả lời

18

Sử dụng FileSystemWatcher như dưới đây để tạo Sự kiện WatcherCreated(). Tôi đã sử dụng điều này để tạo một Dịch vụ Windows xem một thư mục Mạng và sau đó gửi email một nhóm được chỉ định khi đến các tệp mới.

// Declare a new FILESYSTEMWATCHER 
    protected FileSystemWatcher watcher; 
    string pathToFolder = @"YourDesired Path Here"; 

    // Initialize the New FILESYSTEMWATCHER 
    watcher = new FileSystemWatcher {Path = pathToFolder, IncludeSubdirectories = true, Filter = "*.*"}; 
    watcher.EnableRaisingEvents = true; 
    watcher.Created += new FileSystemEventHandler(WatcherCreated); 

    void WatcherCreated(object source , FileSystemEventArgs e) 
    { 
     //Code goes here for when a new file is detected 
    } 
+2

Tôi biết bạn đăng tiểu bang bạn không phải là một lập trình viên .NET nhưng với một bản sao của Free Visual Studio Express và mã tôi đã đăng bạn là% 80 af theo cách đó. Stack OverFlow có thể giúp bạn có được% 20 khác. Tùy thuộc vào những gì bạn muốn làm với các tập tin được phát hiện này là một giải pháp rất đơn giản để thực hiện và triển khai. Nếu bạn quan tâm tôi có thể xây dựng bài viết của tôi cho người tạo cửa sổ dịch vụ. –

+0

Cảm ơn, tôi đã không sử dụng C# trong một vài năm nhưng nếu nó là công cụ tốt nhất cho công việc thì nó là giá trị nỗ lực thêm. Tôi sẽ thiết lập Visual C# Express Edition. Cảm ơn bạn. – Liam

+0

không thể sử dụng trong PowerShell kể từ .NET của nó? bạn không cần studio trực quan. –

3

Sử dụng một FileSystemWatcher

+0

Sẽ Tôi cần Visual Studio? Tôi có thể sử dụng nó từ VBScript không? – Liam

+0

FileSystemWatcher là .Net vì vậy có giải pháp này sẽ yêu cầu Visual Studio. –

6

Nếu bạn muốn một cái gì đó không có lập trình thử [email protected] ... nhưng trong trường hợp đó các câu hỏi sẽ không thuộc về nơi này!

+0

Đúng, câu hỏi này có thể thích hợp hơn cho superuser hoặc thậm chí serverfault, nhưng câu trả lời này trả lời trực tiếp câu hỏi của OP, "Có cách nào thực hiện chương trình khi thay đổi xảy ra không?". – Pat

+0

GiPo @ FileUtilities dường như đã bị gỡ bỏ ngay bây giờ, nhưng http://www.myassays.com/folder-poll thực hiện điều gì đó tương tự nếu bạn cần một cái gì đó không có lập trình. –

1

Không có tiện ích hoặc chương trình đi kèm với Windows để thực hiện. Một số chương trình cần thiết.

Như đã nêu trong câu trả lời khác, .NET FileSystemWatcher là cách tiếp cận dễ nhất.

API gốc ReadDirectoryChangesW khó sử dụng hơn (yêu cầu hiểu biết về các cổng hoàn thành).

7

FileSystemWatcher là câu trả lời đúng trừ khi nó được sử dụng để được rằng FileSystemWatcher chỉ làm việc cho một vài 'thay đổi' tại một thời điểm. Đó là do bộ đệm hệ điều hành. Trong thực tế bất cứ khi nào nhiều tập tin nhỏ được sao chép, bộ đệm giữ tên tập tin của các tập tin thay đổi bị tràn ngập. Bộ đệm này không thực sự đúng cách để theo dõi các thay đổi gần đây, vì hệ điều hành sẽ phải ngừng viết khi bộ đệm đầy để ngăn chặn tình trạng tràn ngập.

Microsoft thay vì cung cấp các tiện ích khác (EDIT: như thay đổi tạp chí) để thực sự nắm bắt tất cả thay đổi. Mà về cơ bản là các cơ sở mà hệ thống sao lưu sử dụng và phức tạp trên các sự kiện được ghi lại. Và cũng có tài liệu kém.

Một thử nghiệm đơn giản là tạo ra một số lượng lớn các tệp nhỏ và xem chúng có được báo cáo bởi FileSystemWatcher hay không. Nếu bạn gặp sự cố, tôi khuyên bạn nên bỏ qua toàn bộ vấn đề và quét hệ thống tệp để thay đổi tại một khoảng thời gian được định thời gian.

+1

Do "cơ sở vật chất khác" có tên mà người ta có thể tìm thấy một số tham chiếu đến chúng? Quét một hệ thống tệp lớn có thể chậm. (Cảm ơn!) –

+0

@Paul, tôi đã chỉnh sửa câu trả lời để cung cấp tham chiếu. Xin đừng quên upvote câu trả lời của tôi nếu bạn nghĩ rằng nó là hữu ích. –

1

Câu hỏi này đã giúp tôi hiểu rất nhiều về Hệ thống Trình theo dõi tệp. Tôi đã triển khai ReadDirectoryChangesW để theo dõi một thư mục và tất cả các thư mục con của nó và nhận thông tin về thay đổi trong các thư mục đó.

Tôi đã viết một bài đăng trên blog giống nhau và tôi muốn chia sẻ nó để nó có thể giúp người nào đó đến đây để giải quyết cùng một vấn đề.

Win32 File Watcher Api to monitor directory changes.

2

Tôi đã truy cập trang này trong khi tìm kiếm cách theo dõi hoạt động của hệ thống tệp. Tôi lấy khúc xạ bài Paladin và FileSystemWatcher rằng ông đã chia sẻ và đã viết một tác C# thực hiện nhanh chóng-và-bẩn:

using System; 
using System.IO; 

namespace Folderwatch 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      //Based on http://stackoverflow.com/questions/760904/how-can-i-monitor-a-windows-directory-for-changes/27512511#27512511 
      //and http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx 

      string pathToFolder = string.Empty; 
      string filterPath = string.Empty; 
      const string USAGE = "USAGE: Folderwatch.exe PATH FILTER \n\n e.g.:\n\n Folderwatch.exe c:\\windows *.dll"; 

      try 
      { 
       pathToFolder = args[0]; 

      } 
      catch (Exception) 
      { 
       Console.WriteLine("Invalid path!"); 
       Console.WriteLine(USAGE); 
       return; 
      } 

      try 
      { 
       filterPath = args[1]; 
      } 
      catch (Exception) 
      { 
       Console.WriteLine("Invalid filter!"); 
       Console.WriteLine(USAGE); 
       return; 

      } 

      FileSystemWatcher watcher = new FileSystemWatcher(); 

      watcher.Path = pathToFolder; 
      watcher.Filter = filterPath; 

      watcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | 
       NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | 
       NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; 

      // 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; 

      // Wait for the user to quit the program. 
      Console.WriteLine("Monitoring File System Activity on {0}.", pathToFolder); 
      Console.WriteLine("Press \'q\' to quit the sample."); 
      while (Console.Read() != 'q') ; 

     } 

     // 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); 
     } 
    } 
} 

Để sử dụng, tải về Visual Studio (Express sẽ làm). Tạo một ứng dụng giao diện điều khiển C# mới gọi là Folderwatch và sao chép và dán mã của tôi vào Program.cs của bạn.

Thay vào đó, bạn có thể sử dụng Sys Internals Process Monitor: Process Monitor Nó có thể giám sát hệ thống tệp và nhiều hơn nữa.

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