FileSystemWatcher не работает с путем, установленным для диска root, если на том же диске, что и приложение - PullRequest
2 голосов
/ 21 февраля 2020

Я использую FileSystemWatcher, чтобы проверить наличие изменений в .exe файлах в любом месте на диске.

FileSystemWatcher Watcher;

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public void Start() {
    Watcher = new FileSystemWatcher("C:") {
        NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Size | NotifyFilters.Security,
        Filter = "*.exe",
        IncludeSubdirectories = true
    };
    Watcher.Created += OnChanged; //Among other events
    Watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e) {
    Debug.WriteLine(e.FullPath);
}

Проблема заключается в том, если для пути наблюдателя установлено значение C: для проверки для файлов на всем диске C: и при запуске моего приложения в любом месте на диске C: (например, C:\Users\Name\Desktop\App.exe) наблюдатель не запускает никаких событий.

Если вместо этого установить путь к C:\Users, тогда наблюдатель будет запускать события - но это, конечно, ограничено изменениями, внесенными в файлы в C:\Users, что не помогает, если файл находится в Program Files или в таком виде.

Та же проблема возникает, если у меня есть наблюдатель, проверяющий диск D:, когда мое приложение находится где-нибудь на диске D:.

Так что, кажется, невозможно установить путь к root диска, на котором запущено приложение. Что может быть причиной этого?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вам нужно передать @"C:\" в конструктор вместо "C:".

Путь C: означает «текущий каталог на диске C:», тогда как C:\ означает «* Каталог 1040 * на диске C:. " Вы можете убедиться в этом сами, открыв Command Prompt и выполнив ...

cd /D "%SystemRoot%"
dir %SystemDrive%\
dir %SystemDrive%

Вторая команда (например, dir C:\) покажет содержимое каталога root системного диска, тогда как последняя команда (например, dir C:) отобразит содержимое текущего каталога на системном диске, который является системным каталогом (например, C:\Windows). Это потому, что это относительный путь, но для указанного c диска. Из Именование файлов, путей и пространств имен ...

Если имя файла начинается только с обозначения диска, но не с обратного знака sh после двоеточия, оно интерпретируется как относительный путь к текущему каталогу на диске с указанной буквой. Обратите внимание, что текущий каталог может быть, а может и не быть каталогом root, в зависимости от того, какой он был установлен во время самой последней операции «изменение каталога» на этом диске. Примеры этого формата:

  • "C: tmp.txt" относится к файлу с именем "tmp.txt" в текущем каталоге на диске C.
  • "C: tempdir \ tmp.txt" относится к файлу в подкаталоге текущего каталога на диске C.

Предполагается, что при запуске C:\Users\Name\Desktop\App.exe it имеет рабочий каталог C:\Users\Name\Desktop\, передав "C:" в FileSystemWatcher, он просто смотрит каталог C:\Users\Name\Desktop\, а не весь том, как вы хотите. Я быстро протестировал ваш код. NET Базовое приложение и подтвердил, что при передаче "C:" сообщается только об изменениях, внесенных в текущий каталог (приложения), тогда как при передаче @"C:\" он правильно контролирует весь том.

0 голосов
/ 21 февраля 2020

Я видел это раньше. Как и вы, я смог заставить некоторые каталоги работать нормально, но указание всего диска никогда не работало должным образом, пока я не разрешил «Разрешения на аудит» для всех папок на всем диске.

В зависимости от операционной системы и версии, с которой вы работаете выполняются в разных направлениях, но для Windows 10 применяется базовая c политика аудита для файла или папки . Имейте в виду, что применение изменений для всего диска может занять некоторое время.

Надеюсь, это поможет.

Удачного кодирования !!!

...