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