C# - 预测文件夹删除时的文件系统事件

2023-11-24

这更多的是一个关于实现这一点的最佳实践是什么的问题。

我有一个FileSystemWatcher这应该告诉我用户对文件和文件夹的更改。子目录也会被监视。在同一目录中,我的程序有时也会发生变化。我不想要FileSystemWatcher检测有关这些程序更改的事件。

我的第一个实现是一个可以添加预期事件的列表。当我收到文件系统事件时,我会检查列表并忽略它(如果存在)。这听起来不是很强大,但似乎很有效。

现在我发现了真正的问题:
D:被观看FileSystemWatcher.
我有两个这样的文件夹:D:\folder1\folder2
现在我想用我的应用程序删除folder1(其中包含folder2)。所以我将 D:\folder1 放入删除列表中。然后我打电话给类似的东西Directory.Delete(@"D:\folder1", true)。现在我注意到无法因异常而删除folder1(为什么)。我从列表中删除了删除条目,但folder2 已被删除,并且我得到了他的FileSystemEvent。因此,我收到 D:\folder1\folder2 的文件系统事件。我的程序认为现在用户已经删除了这个文件夹并且正在做错误的事情。

我现在有一些想法:

1.) 通过删除每个文件和每个文件夹来递归删除文件夹。这样我就可以为每个子文件夹获取并归档一个自己的列表条目。我已经实现了它,但是速度非常非常慢。

2.) 也许有更好的方法在FileSystemWatcher让我的清单过时?

3.) 如果可以删除所有内容,也许可以只删除目录树。因此,如果失败,我仍然拥有所有内容,如果不是,所有内容都会被删除。这对我来说似乎是最优雅的解决方案,但不知道这是否可能?

4.) 我的软件是否可以独占锁定所有文件和文件夹?如果一切顺利,应该可以使用一个删除命令或类似的方式删除所有内容?

我也愿意接受其他额外的解决方案。

编辑1以使其更清楚:

我只想“查看”用户对文件夹的操作。如果我在这里操纵程序中的内容,我不想看到此事件。

通过我的实现,如果文件夹被锁定且无法删除,我会收到子文件夹的事件。

用英语解释并不容易,因为我的母语不是英语;)。

Edit 2:

5.)也许可以过滤FileSystemWatcher来自已定义流程的所有事件?


我最近就做过这样的事;诀窍是让您的“列表”识别出列表中存在文件夹名称的位置,如果需要删除事件,则还丢弃该文件夹中任何内容的任何事件,并且仅当它是文件夹本身时才将其从预测列表中删除。

但我应该警告你,你可能会遇到问题FileSystemWatcher如果快速连续发生太多事件,则缓冲区会变满;如果这样做,它会触发Error事件,并且无法通知您一大堆事件。如果您的预测列表在收到事件时删除项目,则您将面临忽略未来事件的风险,因为您打算忽略的事件由于缓冲区溢出而从未收到。它也可能变得非常大,因为项目永远不会从列表中删除。

尽管您可以设置大小,但我还没有找到可靠的方法来执行此操作FileSystemWatchers 缓冲到最大以在一定程度上减轻它。

编辑:也非常重要:返回的事件在不同的线程上执行(除非您的处理程序位于实现ISynchronizeInvoke, 比如一个Control or Form,然后您设置SynchronizingObject给你的Control/Form。这意味着您需要非常小心地维护列表,并考虑到潜在的竞争条件。我还在为这个问题苦苦挣扎;我的代码在收到错误事件时刷新预测列表,但是当它处理该事件时,自错误以来的其他更改事件已经被触发并处理,并且它会刷新不应该刷新的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# - 预测文件夹删除时的文件系统事件 的相关文章

  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • 如何在 stl 模板中使用导出类 (__declspec(dllexport))?

    我正在使用导出的类 class declspec dllexport myclass private template declspec dllexport class std map
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C

随机推荐