Повідомлення, коли файл змінюється?


111

Чи існує якийсь механізм, за допомогою якого я можу отримувати сповіщення (на C #), коли файл змінюється на диску?


1
Дивіться цю відповідь для отримання додаткової інформації про клас FileSystemWatcher та події, які він викликає.
ChrisF

Відповіді:



204

Ви можете використовувати 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, якщо ви шукаєте блокувальний (синхронний) спосіб спостереження за змінами.
Марк Меуер

22
Дякую за цей приклад. MSDN має майже те саме тут . Також деякі люди можуть захотіти переглянути ціле дерево каталогів - використовуйте watcher.IncludeSubdirectories = true;для цього.
Олівер

1
OnChangeпожежі без фактичних змін ( наприклад: натискання ctrl+sбез фактичних змін ), чи є спосіб виявити підроблені зміни?
Мехді Дехгані

1
@MehdiDehghani: Не те, що я знаю, єдиний спосіб, здається, полягає в тому, щоб насправді зберегти знімок файлу і порівняти цей байт-модуль з поточною (імовірно, зміненою) версією. FileSystemWatcherТільки здатне виявляти події на рівні файлової системи (тобто якщо ОС ініціює подія). У вашому випадку Ctrl + S викликає таку подію (все-таки відбудеться це чи ні, залежить від фактичної програми).
Дірк Волмар

Чи є міжплатформованість FileSystemWatcher?
Вінігас

5

Використовуйте FileSystemWatcher. Ви можете фільтрувати лише події модифікації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.