【问题标题】:Call a function before Delete happens in Windows在 Windows 中删除之前调用函数
【发布时间】:2014-03-04 10:44:29
【问题描述】:

在调用Delete函数之前,我需要调用一个函数来判断它是文件夹还是文件。

我正在使用 File Watcher 来了解在我的默认文件夹中所做的所有更改。 我需要使用路径获取已删除项目的类型(文件或文件夹)。 但由于文件夹/文件已被删除,我收到路径错误(找不到路径!),因为文件/文件夹已被删除。

有没有办法在使用 File Watcher 或任何其他方法删除项目之前获取已删除项目的类型?

这是我用于确定文件或文件夹的函数。该函数在文件观察器中的 Delete 事件(filewatcher.Deleted) 中调用。

private static bool IsDirectory(string path)
{
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
     bool isDirectory = false;
     if ((fa & FileAttributes.Directory) != 0)
     {
         isDirectory = true;
     }
     return isDirectory;
}

希望我的问题足够清楚!提前致谢!

【问题讨论】:

    标签: c# .net desktop-application


    【解决方案1】:

    TL;DR:这不可能以任何相当简单的方式完成,但您可以通过做一些“足够相似”的事情来解决它。

    您不能直接使用托管代码执行此操作,因为 FileSystemWatcher 仅对已经进行的更改做出反应,此时文件已被删除,您无法查询有关它的信息。

    理论上,您可以在非托管代码中实现这一点,方法是编写一个 DLL 并将其注入所有可能删除您感兴趣的文件的进程; DLL 将挂钩适当的 Win32 函数——一个不错的选择是(未记录的)NtSetFileInformation,它是要删除文件时调用的最低级别函数——并在删除发生之前检索您感兴趣的信息.当然,这将非常困难并且非常复杂,因此在实践中它可能根本不是一个选择。

    您可能想要尝试的一种解决方法是缓存有关目录内容的信息(例如,记住其中存在的所有子目录),然后检索“那是目录吗?”缓存中的信息。如果这就是你所需要的,并且你可以容忍不时出现的假阴性,那么它应该很容易实现。

    【讨论】:

    • 非常感谢!是否可以阻止 Windows 中的默认删除功能并从我的应用程序中调用删除功能?(通过您的回答后提出的这个问题。:))
    • @user3222297:理论上可能是(不确定),但它仍然涉及将您的代码注入您想要修改的所有进程中,并且您将拥有为您自己的应用程序提供通信渠道,编写有效的服务器等等。你真的不想去那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2020-04-01
    • 2012-02-07
    • 2017-08-28
    • 2019-10-03
    • 2010-11-26
    相关资源
    最近更新 更多