แจ้งเตือนเมื่อไฟล์มีการเปลี่ยนแปลง?


113

มีกลไกบางอย่างที่ฉันสามารถรับการแจ้งเตือน (ใน C #) เมื่อไฟล์ถูกแก้ไขบนดิสก์หรือไม่?


1
ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคลาส FileSystemWatcher และเหตุการณ์ที่เกิดขึ้น
ChrisF

คำตอบ:



206

คุณสามารถใช้FileSystemWatcherคลาส

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
ขอบคุณสำหรับตัวอย่างที่ดี ฉันจะชี้ให้เห็นว่าคุณสามารถใช้วิธี WaitForChanged บน FileSystemWatcher หากคุณกำลังมองหาวิธีการบล็อก (ซิงโครนัส) เพื่อดูการเปลี่ยนแปลง
Mark Meuer

22
ขอบคุณสำหรับตัวอย่างนี้ ที่ MSDN มีสวยมากเหมือนกันที่นี่ นอกจากนี้บางคนอาจต้องการดูแผนผังไดเรกทอรีทั้งหมด - ใช้watcher.IncludeSubdirectories = true;เพื่อบรรลุเป้าหมายนั้น
Oliver

1
OnChangeยิงโดยไม่มีการเปลี่ยนแปลงจริง ( เช่นการกดปุ่มctrl+sโดยไม่มีการเปลี่ยนแปลงจริง ) มีวิธีใดในการตรวจจับการเปลี่ยนแปลงปลอมหรือไม่?
Mehdi Dehghani

1
@MehdiDehghani: ไม่ใช่ว่าฉันรู้วิธีเดียวที่ดูเหมือนจะเก็บสแนปชอตของไฟล์และเปรียบเทียบไบต์ที่ชาญฉลาดกับเวอร์ชันปัจจุบัน (น่าจะมีการเปลี่ยนแปลง) มีFileSystemWatcherเพียงอย่างเดียวเท่านั้นที่สามารถตรวจจับเหตุการณ์ที่ระดับระบบไฟล์ (เช่นหากระบบปฏิบัติการทริกเกอร์เหตุการณ์) ในกรณีของคุณ Ctrl + S จะทริกเกอร์เหตุการณ์ดังกล่าว (ไม่ว่าจะเกิดขึ้นหรือไม่ขึ้นอยู่กับแอปพลิเคชันจริง)
Dirk Vollmar

FileSystemWatcher ข้ามแพลตฟอร์มหรือไม่
Vinigas

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.