在Windows中执行删除之前调用函数

时间:2014-03-04 10:44:30

标签: c# .net desktop-application

我需要调用一个函数来确定在调用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;
}

希望我的问题足够明确!提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

理论上,你可以通过编写DLL并将其注入可能删除你感兴趣的文件的所有进程中,在非托管代码中实现它; DLL将挂钩相应的Win32函数 - 一个很好的选择是(未记录的)NtSetFileInformation,这是在删除文件时调用的最低级函数 - 并在之前检索您感兴趣的信息。删除发生。当然,这将是非常困难和非常复杂的,所以在实践中它可能根本不是一个选择。

您可能想要尝试的解决方法是缓存有关目录内容的信息(例如,记住其中存在的所有子目录),然后检索“那是一个目录吗?”来自缓存的信息。如果这就是你所需要的,你可以偶尔容忍误报,那么它应该相当容易实现。