Знать, когда файл изменяется в окнах 8

Я знаю, что класс FileSystemWatcher не работает в Windows 8. Почему обнаружены изменения атрибутов FileSystemWatcher в Windows 7, но не в Windows 8?

В любом случае мне нужно знать, когда файл изменяется в каталоге. Например, у меня установлен Dropbox на моем компьютере, и как только я обновляю файл, он начинает синхронизацию. Как dropbox знает, когда файл изменился в Windows 8?

Я уже пробовал это решение в С++ http://msdn.microsoft.com/en-us/library/aa365261, и у меня такая же проблема, как у FileSystemWatcher. Проблема, похоже, связана с Windows 8, а не с классом FileSystemWatcher. Что можно решить с помощью решения?

Ответ 1

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

static void StartWatching(string path)
{
    var watcher = new FileSystemWatcher();
    watcher.Path = path;
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName |
                           NotifyFilters.DirectoryName;
    watcher.Changed += watcher_Created;
    watcher.Created += watcher_Created;
    watcher.EnableRaisingEvents = true;

    var copier = new Thread(ConsumeOutOfTheFilesToCopyQueue);
    copier.Start();
}

    static void watcher_Created(object sender, FileSystemEventArgs e)
    {
        if (e.Name.Contains("whatever.dll"))
            if (!_filesToCopy.Contains(e.FullPath))
                lock (_syncRoot)
                    if (!_filesToCopy.Contains(e.FullPath))
                        _filesToCopy.Enqueue(e.FullPath);
    }

Ответ 2

Да, это правильно. FileSystemWatcher наблюдает за каталогами, и он вызывает события, связанные с ними. Но информация в этом случае может использоваться для отслеживания файлов. Вот некоторый код, который я использую для отслеживания изменений в файле изображения.

#region ----------------File System WATCHER ----------------------------
// this happens at construction time
FileSystemWatcher fileSystemWatcher = new System.IO.FileSystemWatcher();
fileSystemWatcher.Changed += new System.IO.FileSystemEventHandler(fileSystemWatcher_Changed);
fileSystemWatcher.Deleted += new System.IO.FileSystemEventHandler(fileSystemWatcher_Deleted);
fileSystemWatcher.Renamed += new System.IO.RenamedEventHandler(fileSystemWatcher_Renamed);

private void WatchFile(String fullFilePath)
{
    if (!File.Exists(fullFilePath))
        return;
    fileSystemWatcher.Path = Path.GetDirectoryName(fullFilePath);
    fileSystemWatcher.Filter = Path.GetFileName(fullFilePath);
    fileSystemWatcher.EnableRaisingEvents = true;
}
//    and those are the handlers
//
private void fileSystemWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
    Bitmap bmp = null;
    FileInfo finfo = new FileInfo(m_currentFileName);
    if (!finfo.Exists)
        return;
    //Load and display the bitmap saved inside the text file/
    ------------ here ---------------
    // OR WHATEVER YOU NEED TO

}

private void fileSystemWatcher_Deleted(object sender, System.IO.FileSystemEventArgs e)
{
    this.pictureBoxArea.BackgroundImage = null;
    fileSystemWatcher.EnableRaisingEvents = false;
    labelFileInfo.Text = "";
    MediaAvailablForUpload = false;
}

private void fileSystemWatcher_Renamed(object sender, System.IO.RenamedEventArgs e)
{
    pictureBoxArea.BackgroundImage = null;
    fileSystemWatcher.EnableRaisingEvents = false;
    labelFileInfo.Text = "";
}
#endregion

Я использовал этот код в winxp, win7 и win8 и выполнял как ожидалось.