在Windows中检测文件“COPY”操作

时间:2009-10-16 08:28:09

标签: c# .net windows winapi

假设我希望在系统上启动文件副本时获得通知,并获取文件名,复制或移动文件的目的地以及复制时间。

这可能吗?你会怎么做?你应该挂钩CopyFile API函数吗?

是否有任何软件已经实现了这一目标?

5 个答案:

答案 0 :(得分:8)

Windows具有I / O过滤器的概念,允许您拦截所有I / O操作并选择执行其他操作。它们主要用于A / V类型的场景,但可以编程用于各种任务。例如,SysInternals Process Monitor使用I / O过滤器来查看文件级访问。

您可以使用MS Filter Manager(命令提示符下的fltmc.exe)

查看当前过滤器

有一个工具包可以帮助您编写过滤器,您可以获得驱动程序并开发自己的驱动程序。

http://www.microsoft.com/whdc/driver/filterdrv/default.mspx是获取深度信息的起点

答案 1 :(得分:5)

由于此问题上有一个.NET标记,我只想使用.NET Framework中的System.IO.FileSystemWatcher。我猜它是用the I/O Filters that Andrew mentions in his answer实现的,但我真的不知道(也不关心,确切地说)。这符合您的需求吗?

答案 2 :(得分:1)

正如安德鲁所说,过滤器驱动程序是可行的方法。

没有万无一失的检测文件副本的方法,因为不同的程序以不同的方式复制文件(有些可能使用CopyFile API,有些可能只读取一个文件并将内容写入另一个文件)。您可以尝试计算任何为读取而打开的文件的过滤器驱动程序中的哈希值,然后在程序完成写入文件后执行相同操作。如果哈希匹配,则表示您有文件副本。然而,这种技术可能很慢。如果您只是挂钩CopyFile API,您将错过没有该API的文件副本。 Java程序(仅限一个)无法访问CopyFile API。

答案 3 :(得分:1)

这可能是不可能的,因为没有保证执行复制/移动的中心方法。你可以挂钩到一个核心API(比如CopyFile)但当然这意味着你仍然会在没有使用这个API的情况下错过任何应用程序所做的任何复制/移动。

也许您可以使用IO过滤器查看整个文件系统以查找打开的文件,然后只要同时打开两个具有相同名称和相同文件大小的文件,就可以自己得出结论。但这也没有100%的解决方案。

答案 4 :(得分:0)

如前所述,文件复制操作可以以各种方式实现,并且可能涉及多个磁盘和存储器传输,因此当发生这种操作时,不可能简单地得到系统的通知。 即使对于用户,也有多种方法可以复制内容和整个文件。复制命令,“另存为”,“发送到”,移动,使用各种工具。在引擎盖下,复制操作是一系列读/写,由某些参数相关联。这是保证审计成功的唯一方法。例如,挂起CopyFile不会给你Total Commander的复制操作。它也不会给你“另存为”操作,实际上是文件创建 - >文件内容已移动 - >关闭原始文件 - >打开新文件。然后,在处理网络拷贝,模拟拷贝操作(文件句柄安全上下文与进程安全性上下文不同)等情况时,情况会有所不同,等等。我认为没有一种直接的方法来实现上述所有目标。

但是,有一个软件可以通知您大多数常见的复制操作(即通过Windows资源管理器,总指挥器,命令提示符和其他应用程序执行时)。它还为您提供源和目标文件名,时间戳和其他相关详细信息。它可以在这里找到:http://temasoft.com/products/filemonitor

注意:我为开发此产品的公司工作。