Вопрос по filesystemwatcher, .net, wpf, c# – FileSystemWatcher используется для наблюдения за открытием папки / файла

6

Я просмотрел, но не могу найти какую-либо информацию о том, что я ищу, если есть еще один пост, который уже идет по этому вопросу, то я прошу прощения.

Я ищу помощь с кодом, который будет отслеживать определенную папку, когда папка открывается другим человеком или когда файл в указанной папке открыт. На этом этапе я вижу, когда пользователь открывает и изменяет какие-либо файлы, но если он просто открывает файл для его просмотра, он не генерирует событие, даже когда я добавляю LastAccessed. Любая информация или помощь будут оценены.

Имя папки C: \ Junk

Код в C # 4.0:

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public static void Run()
    {


        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"C:\";
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.Filter = "junk";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);
        watcher.IncludeSubdirectories = true;
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        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);
    }
@ Steve - по вашему предложению я изменил свой код, но он по-прежнему не срабатывает при открытии папки. Saren
Если имя папки C: \ JUNK, почему неВы помещаете это в свойство Path? свойство Filter используется для отображения файлов, а не папок Steve
Чтобы сделать это быстро, я просто использовал уровень аудита безопасности NTFS. mbrownnyc
Попробуйте драйвер фильтра файловой системы, чтобы отслеживать изменения такого рода. Другие варианты не делаютне работает хорошо. Eugene Mayevski 'Allied Bits

Ваш Ответ

5   ответов
0

NtQuerySystemInformation Перечисление и таймер, таким образом, вы можете сканировать каталог и посмотреть, если какие-либо файлы открыты. наблюдатель файловой системы не даст вам эту информацию

0

Вы должны установить

watcher.Path = @"C:\junk";

и удалитьwatcher.Filter строка, если событие должно запускаться для всех файлов

С помощьюФильтр свойство, которое вы можете установить подстановочные знаки для соответствующих файлов, например*.txt

Я изменил свой код в соответствии с предложением, но по-прежнему нет триггера при открытии. Saren
0
public void OnChanged(object sender, FileSystemEventArgs e)
{
    string FileName = System.IO.Path.GetFileName(e.FullPath);

    if(IsAvailable(System.IO.Path.Combine(RecievedPath,FileName)))
    {
        ProcessMessage(FileName);
    }
}


private void ProcessMessage(string fileName)
{
    try
    {
       File.Copy(System.IO.Path.Combine(RecievedPath,fileName), System.IO.Path.Combine(SentPath,fileName));
        MessageBox.Show("File Copied");
    }
    catch (Exception)
    { }
}

private static bool IsAvailable(String filePath)
{
    try
    {
        using (FileStream inputStream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
        {
            if (inputStream.Length > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
    }
    catch (Exception)
    {
        return false;
    }
}
0

йвера минифильтра. Вы должны реализовать драйвер минифильтра, чтобы выполнить требования.

ИМХО это правильный ответ radiolondra
2

Так какNotifyFilters.LastAccessed указывает, что вы хотите получить это свойство, а не событие для подписки. Доступные события,ChangedCreated, или жеDeletedни один из которых не делает то, что вы хотите.

Вы должны взглянуть наReadDirectoryChangesW Функция Win32, документированнаяВот, Это может быть переданоFILE_NOTIFY_CHANGE_LAST_ACCESS флаг, который, кажется, доставляет то, что вы хотите:

Любое изменение времени последнего доступа к файлам в наблюдаемом каталоге или поддереве приводит к возврату операции ожидания уведомления об изменении.

Редактировать: игнорировать это,FileSystemWatcher внутренне проходитNotifyFilters.LastWrite как int 32, что так же, какFILE_NOTIFY_CHANGE_LAST_ACCESS, чтобыReadDirectoryChangesW, Эта функция тогда еще не уведомляет о доступе к файлу, ямы пробовали

Возможно это вызваноэтот:

Время последнего доступа имеет слабую гранулярность, которая гарантирует, что время точно с точностью до одного часа. В Windows Vista мыМы отключили обновления до времени последнего доступа для улучшения производительности NTFS. Если вы используете приложение, которое использует это значение, вы можете включить его с помощью следующей команды:

fsutil behavior set disablelastaccess 0

Вы должны перезагрузить компьютер, чтобы изменения вступили в силу.

Если вы выполните это в командной строке, возможно, тогдаLastAccess будет написано и событие сработает. Я'я не собираюсь примерять мой SSD и неготовая виртуальная машина, но на Windows 7disablelastaccess Похоже, что он включен "из коробки".

Если это все еще нене работать, когда вы отключите это поведение, подождите, пока Рэймонд Ченящик для предложений (или сам), чтобы прийти, обычно тамЭто довольно логичное объяснение того, почему документация, похоже, не правильно описывает поведение, с которым вы сталкиваетесь. ;-)

Вы также можете просто просмотреть каталог в цикле и посмотреть на свойство LastAccessed файлов. Что ты пытаешься сделатькогда пользователь открывает определенный файл?

Большое спасибо! Saren
Сначала попробуйте это реализовать ...;) CodeCaster
@Saran см редактировать. Это победилот работа. CodeCaster
Кажется, это PITA, но этоЯ в другой раз, а пока я счастлив, что у меня есть маршрут. Saren

Похожие вопросы