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

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

这可能吗? 你将如何去呢? 你应该钩CopyFile API函数?

有没有什么软件已经完成了这个?

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

您可以使用MS Filter Manager(来自命令提示符的fltmc.exe)查看当前的筛选器,

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

http://www.microsoft.com/whdc/driver/filterdrv/default.mspx是深入了解信息的起点

由于在这个问题上有一个.NET标记,我只需要使用.NET Framework中的System.IO.FileSystemWatcher 。 我猜这是用安德鲁在他的回答中提到的I / O过滤器来实现的 ,但我真的不知道(也不在乎)。 这是否符合您的需求?

正如安德鲁所说过滤器驱动程序是要走的路。

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

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

也许你可以用IO过滤器来查看整个文件系统的打开文件,然后只要同时打开两个同名文件相同的文件就可以得出结论。 但是,也没有100%的解决方案。

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

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

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