Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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.Deleted not Firing on”;“正常”;删除?_C#_.net - Fatal编程技术网

C# C“FileSystemWatcher.Deleted not Firing on”;“正常”;删除?

C# C“FileSystemWatcher.Deleted not Firing on”;“正常”;删除?,c#,.net,C#,.net,代码: 创建的事件工作正常,但删除的事件仅在使用SHIFT删除目录/或Exe时触发。但是普通删除(移动到回收站)不起作用/触发事件 如何解决此问题?这是预期的行为,因为文件实际上并未被删除:它已被移动 尝试附加到 FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(path, "*.exe"); fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.C

代码:

创建的事件工作正常,但删除的事件仅在使用SHIFT删除目录/或Exe时触发。但是普通删除(移动到回收站)不起作用/触发事件


如何解决此问题?

这是预期的行为,因为文件实际上并未被删除:它已被移动

尝试附加到

FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(path, "*.exe");
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.Created += new FileSystemEventHandler(fileSystemWatcher_Created);
fileSystemWatcher.Deleted += new FileSystemEventHandler(fileSystemWatcher_Deleted);
fileSystemWatcher.EnableRaisingEvents = true;
并检查文件是否被移动到回收站


请注意,找到回收站在文件系统中的实际位置并非易事。其他人发布的一些代码(未经测试)在这里:-也在这里:

我知道这是一个老问题,但我通过将文件名添加到FileSystemWatcher对象的NotifyFilter属性来解决此问题。

解决方案是使用以下代码:

filesystemWatcher.Renamed
请注意
NotifyFilter
属性,这些是它必须使用的过滤器。这将触发
添加的
删除的
文件。我在
.netframework4.5

中测试了这一点,这一点很有效

private static void EnableFileWatcherLvl1(string folder, string fileName)
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = folder;
    watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.Attributes;
    watcher.Filter = "*.txt";
    watcher.Changed += watcher_Changed;
    watcher.Deleted += watcher_Changed;
    watcher.EnableRaisingEvents = true;
}

static void watcher_Changed(object sender, FileSystemEventArgs e)
{            
    switch (e.ChangeType)
    {
        case WatcherChangeTypes.Changed: { // code here for created file }
             break;
        case WatcherChangeTypes.Deleted: { // code here for deleted file }
             break;
    }       
}

这很清楚,我知道这一点,但是如何解决这个问题呢?对象没有移动事件!在此基础上,回收站实际上只是一个特殊的系统目录,通常是
C:\$RECYCLER
C:\$recycle.bin
。它将软删除的文件聚合到一个特殊的树结构中,然后允许恢复或永久删除这些文件。@JeremyMcGee有趣的是,只是为了澄清一下,如果它们移位删除会发生什么?为了检测移动,您可以使用更改的事件。移动文件时,文件会标记为已更改。然后,您应该能够使用
file.Exists
@eMi:检查文件是否确实存在。删除文件后清空回收站时是否会触发事件?不,只有在删除包含SHIFTMh的文件时才有意义。删除它意味着将其移动到回收站,这是一个
重命名
事件。之后,该文件超出了您正在查看的路径。将文件移动/重命名到回收站不是删除。单击“删除”将文件移动到回收站纯粹是一个shell抽象,文件系统不知道这一点。奇怪的是,它对我来说是应该的。当文件被删除或“shift+delete”时会触发。对我来说不起作用。无论我如何删除(带/或不带Shift),它都不会触发。奇怪..@IgorStack;您是否将EnableRaisingEvents设置为true?
FileSystemWatcher fsw = new FileSystemWatcher(folderPath);
        fsw.Deleted+= FileSystem_Deleted;
        fsw.EnableRaisingEvents = true;
        fsw.IncludeSubdirectories = true;

static void FileSystem_Deleted(object sender, FileSystemEventArgs e)
    {
        // Write your code
       MessageBox.Show("Deleted Item is " + e.name);

    }