Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获监视文件夹删除事件_C#_Filesystemwatcher - Fatal编程技术网

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

C# 如何捕获监视文件夹删除事件,c#,filesystemwatcher,C#,Filesystemwatcher,我有一个名为FileWatch的文件监视目录 C:\Users\MyFolder\FileWatch\Test FileWatch文件夹是监视目录。我的应用程序正在接收FileWatch目录下发生的所有事件 但是,如果我删除FileWatch文件夹本身,则不会生成任何文件系统事件 如果用户删除FileWatch目录本身,是否有任何方法可以捕获?与其在FileWatch文件夹上设置FileWatcher实例,不如使用父文件夹(MyFolder)进行设置。这样,您可以在FileWatch文件夹中

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

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

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


如果用户删除FileWatch目录本身,是否有任何方法可以捕获?

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

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


编辑:如果您需要确保目录不会被删除,您可以在查看目录时在目录中创建和插入目录。

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

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

选项(如前所述)-改为监视目录
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;

这对我很有效,它使用阻塞调用,不需要事件。我相信有人会投我反对票,但如果这对某人有帮助,那就是我为什么在这里

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();
            }
        }
    }
}

在父目录中添加一个
FileSystemWatcher
?这不是您在问题中所说的。请发布正确的文件路径。对不起,我没有意识到这个问题。在解决这个问题后,我想了一下。问题是,如果文件夹是C:\FileWatch,那么我们就不能监视父文件夹。在某些Windows操作系统中,它将允许删除文件查看器的上述文件夹。顺便说一句,您可以使用
Path.GetDirectoryName(Path)
获取您正在监视的文件夹的父文件夹。我使用文件夹结构C:\MyFolder测试了您的代码,如果我删除MyFolder,则不会执行删除事件。不,它正在工作。您应该将路径更改为@“C:\”,并在事件处理程序中检查@“C:\MyFolder”全名。或者使用上面提到的GetDirectoryName。只需在事件处理程序上设置断点并进行验证。如果您在ConsoleApplication中尝试此操作,请记住,该Console.ReadKey()会阻止输出。关键是调用Refresh(),因为Microsoft有人认为缓存目录信息会很方便。