【问题标题】:Access file before it's deleted在文件被删除之前访问文件
【发布时间】:2016-08-31 15:50:16
【问题描述】:

在使用FileSystemWatcher.OnDeleted 事件时,是否可以在文件被删除之前访问它?

我在其元数据中存储了有关文档本身的一些数据,并且在删除之前我需要该信息。

如果可能的话,任何想法如何在有或没有FileSystemWatcher 的情况下完成此任务?

更新://

我意识到将数据存储在文件中是不好的,因为删除文件后我无法访问它。

解决方案:重写我的应用程序以将数据存储在本地数据库(sqlite/xml 或类似的东西)中,因为我在创建/重命名/更新文件时获得了完整的路径和名称/deleted 更新文件的数据库记录会更容易。

感谢大家的意见和建议!

【问题讨论】:

  • 我几乎想说不,你不能,因为一旦文件被删除,事件就会触发。我不相信 FSW 可以在事件完成之前知道该事件,因为这意味着甚至需要触发和捕获预删除,然后允许您在文件上创建锁定。
  • 我认为仅使用FileSystemWatcher 是不可能的。我不确定 Windows 是否允许使用较低级别的挂钩(尽管我对此表示怀疑。)
  • 您将从事件处理程序中获得全名。使用它来恢复文件、使其不可见、读取和删除文件。 hackish 并且不是万无一失的,但仍然有些东西:stackoverflow.com/questions/2837307/…
  • @nawfal 那行不通。如果您尝试在事件处理程序中访问该文件,您将收到 FileNotFoundException
  • @GETah 是的,这就是为什么我要他从回收站恢复文件,读取它然后再次删除。他肯定会从事件处理程序中获得文件的名称和相关属性!只是他无法访问文件本身

标签: c# windows .net-4.0 filesystemwatcher


【解决方案1】:

使用时是否可以在删除文件之前访问文件 FileSystemWatcher.OnDeleted 事件?

该事件在文件删除之后而不是之前触发,因此引发该事件时您将无法访问该文件。

如果可能的话,有什么想法可以做到这一点吗?

我会改用OnChanged 事件,每次文件更改时都会触发该事件。基本上,每次文件更改时,您都会读取文件元数据。如果文件经常更新,这可能会有点麻烦,但应该允许您在删除文件之前拥有最新的元数据。

【讨论】:

  • OnChanged 不一定要在 OnDelete 之前触发!
  • 也不能保证文件在被删除之前会被更改。
  • @Aviatrix 如果文件在删除之前没有更改,则没有任何内容可读取。
  • 如果文件没有被更改和删除,仍然有东西可以从中读取。这个解决方案实际上不起作用
  • @nawfal 除了可以在OnCreate 事件中检索到的文件描述符数据之外,我看不到 OP 可以从空文件中读取什么 :)
【解决方案2】:
FileSystemWatcher1 = Your Main Watcher.
FileSystemWatcher2 = RecycleBin Watcher

If the FileSystemWatcher1 Deleted file == the FileSystemWatcher2 Created File
{
    //Do what you want with the FileSystemWatcher2.FullPath
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多