Thông báo khi tệp thay đổi?


111

Có cơ chế nào mà tôi có thể được thông báo (trong C #) khi tệp được sửa đổi trên đĩa không?


1
Xem câu trả lời này để biết thêm thông tin về lớp FileSystemWatcher và các sự kiện mà lớp này tạo ra.
ChrisF

Câu trả lời:



204

Bạn có thể sử dụng FileSystemWatcherlớp học.

public void CreateFileWatcher(string path)
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = path;
    /* 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);
}

11
Cảm ơn vì ví dụ tốt đẹp. Tôi cũng sẽ chỉ ra rằng bạn có thể sử dụng phương thức WaitForChanged trên FileSystemWatcher nếu bạn đang tìm kiếm một cách chặn (đồng bộ) để theo dõi các thay đổi.
Mark Meuer,

22
Cảm ơn vì ví dụ này. MSDN có khá nhiều thứ giống nhau ở đây . Ngoài ra, một số người có thể muốn xem toàn bộ cây thư mục - hãy sử dụng watcher.IncludeSubdirectories = true;để đạt được điều đó.
Oliver

1
OnChangecháy mà không có thay đổi thực tế ( ví dụ: đánh ctrl+smà không có bất kỳ thay đổi thực tế nào ), có cách nào để phát hiện các thay đổi giả mạo không?
Mehdi Dehghani

1
@MehdiDehghani: Không phải tôi biết, cách duy nhất dường như là thực sự giữ một ảnh chụp nhanh của tệp và so sánh byte đó với phiên bản hiện tại (có lẽ đã thay đổi). Duy FileSystemWatchernhất có thể phát hiện các sự kiện ở cấp hệ thống tệp (tức là nếu hệ điều hành kích hoạt một sự kiện). Trong trường hợp của bạn, Ctrl + S sẽ kích hoạt sự kiện như vậy (mặc dù điều đó có xảy ra hay không phụ thuộc vào ứng dụng thực tế).
Dirk Vollmar

FileSystemWatcher có đa nền tảng không?
Vinigas

5

Sử dụng FileSystemWatcher. Bạn chỉ có thể lọc các sự kiện sửa đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.