Привет всем и извините, если я повторяю вопрос (мой английский так плох). Есть ли способ получать уведомления, когда файлы открываются пользователем? Что-то вроде класса FileSystemWatcher, только с событием «Открыто»? Я просто хочу обнаружить открывающийся файл без изменения или переименования этого файла. например, теперь я обнаруживаю переименование файла и хочу также обнаруживать открытие

private void hookEvents(String path, String password)
    {
        FileSystemWatcher fsw = new FileSystemWatcher();
        fsw.Path = Path.GetDirectoryName(path);
        fsw.Filter = Path.GetFileName(path);
        fsw.Renamed += new RenamedEventHandler(onRenamed);
        fsw.EnableRaisingEvents = true;
    }

P.S. Я слышал кое-что о фильтрах и драйверах, но надеюсь, что у C # есть простой способ выполнить мой запрос.

2
mechanikos 18 Мар 2014 в 18:11

2 ответа

Лучший ответ

System.IO.FileSystemWatcher создан для отслеживания изменений файлов. Поскольку «открытие файла» не меняет сам файл, это точно не сработает.

Есть возможные способы сделать это

Вариант 1

Вы можете определить, используется ли файл, либо с помощью запроса WMI (если ваша ОС основана на Windows), либо путем открытия файла для записи (исключение возникает, когда файл используется).

Вариант 2

Вы можете попытаться получить дескриптор файла и посмотреть, какой процесс является владельцем. Если да, то файл открыт кем-то другим. проверьте это сообщение Используя C #, как можно выяснить, какой процесс заблокировал файл?

2
Community 23 Май 2017 в 12:20

Я не думаю, что есть простой ответ, который можно было бы реализовать на C #.

В этом вопросе есть некоторая информация, но все это довольно низкоуровневые вещи ... Фильтр файловой системы драйверы и хуки API!

Вы хотите отслеживать небольшой набор файлов в папке или весь диск?

2
Community 23 Май 2017 в 11:56