如何捕获监视文件夹删除事件

本文关键字:删除 事件 文件夹 监视 何捕获 | 更新日期: 2023-09-27 18:29:23

我有一个名为FileWatch 的文件监视目录

 C:'Users'MyFolder'FileWatch'Test

FileWatch文件夹是监视目录。我的应用程序正在接收FileWatch目录下发生的所有事件。

但是,如果我删除FileWatch文件夹本身,则不会生成任何文件系统事件。

如果用户删除FileWatch目录本身,有什么方法可以捕获吗?

如何捕获监视文件夹删除事件

根据FileSystemWatcher类的描述,当被监视的目录中的文件或目录被更改/删除/创建/重命名时,会引发事件

所以,它不应该监视目录本身。它只监视该目录内的文件和目录。

选项(如前所述)-改为关注目录C:'Users'MyFolder'FileWatch

更新:如果您只想查看目录C:'Users'MyFolder'FileWatch'Test删除:

string path = @"C:'Users'MyFolder'FileWatch"; // watch for parent directory
if (!Directory.Exists(path)) // verify it exists before start
    return;
FileSystemWatcher watcher = new FileSystemWatcher(path);
// set option to track directories only
watcher.NotifyFilter = NotifyFilters.DirectoryName;
watcher.Deleted += (o, e) =>
{
    if (e.FullPath == @"C:'Users'MyFolder'FileWatch'Test")
    {
        // If you are here, your test directory was deleted
    }
};
watcher.EnableRaisingEvents = true;

我建议您只需查看父目录,或者您可以尝试使用计时器检查目录是否已使用Directory.Exists删除。

编辑:如果你需要确保目录不会被删除,你可以在观看时在目录内创建并锁定一个文件。

这对我很有效,它使用了阻塞调用,不需要事件。

using System.IO;
namespace Sapbucket.Common
{
    public static class FolderSupport
    {
        public static void DeleteFolder(string folderPath, bool recursively)
        {
            DirectoryInfo _directoryInfo;
            _directoryInfo = new DirectoryInfo(folderPath);
            _directoryInfo.Refresh();
            if (_directoryInfo.Exists)
            {
                _directoryInfo.Delete(recursively);
                while (_directoryInfo.Exists)
                    _directoryInfo.Refresh();
            }
        }
    }
}

与其在FileWatch文件夹上设置FileWatcher实例,不如使用父文件夹(MyFolder)进行设置。这样,就可以捕获FileWatch文件夹中的文件事件,以及删除FileWatch文件夹本身时激发的事件。