我需要在整个Windows文件系统中检测何时以任何方式访问两种文件types之一。
据我所知,这样做不会造成操作系统的严重缓慢的唯一方法是创build一个文件系统filter驱动程序?
基本上我需要做的就是打开任何doc(x)文件和pdf的副本。 我决定采用这种方法,因为它不是在C#中使用文件监视器,而是在整个驱动器上无效。
我的问题是双重的,是否有一个更简单的方法,其次我怎么去简单地获取每个doc(x)/ pdf文件的副本,因为它被访问?
解决scheme需要使用我们当前生产的软件包进行部署。
UPDATE
我将在文档系统监视器的基准testing中与人们讨论后,我认为这可能是可以接受的,但我担心的是我需要监视下载将发生的常见用户目录(所以“C: \ Users \ SomeUser *“以及Outlook临时文件夹。
您将需要创建一个文件系统观察器。 这里是一个代码示例,它将监视对docx文件的更改。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Security.Permissions; namespace filewatchtest { class Program { static void Main(string[] args) { Run(); } [PermissionSet(SecurityAction.Demand, Name="FullTrust")] public static void Run() { string[] args = System.Environment.GetCommandLineArgs(); // if directory not specified then end program if (args.Length != 2) { Console.WriteLine("Usage: filewatchtest.exe directory"); return; } // create a new fileSystemWatcher and set its properties FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = args[1]; // set the notify filters watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // set the file extension filter watcher.Filter = "*.docx"; // add event handlers watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // bengin watching watcher.EnableRaisingEvents = true; // wait for the user to quit the program Console.WriteLine("Plress q to quit the program"); while (Console.Read()!='q'); } static void OnRenamed(object sender, RenamedEventArgs e) { Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); } static void OnChanged(object sender, FileSystemEventArgs e) { Console.WriteLine("File:" + e.FullPath + " " + e.ChangeType); } } }
我认为在读取时创建一个副本会导致很多问题。 比如:病毒扫描器。 考虑以下:
现在,您可以创建具有不同扩展名的副本来防止这种情况发生,但仍然会对文件执行大量的READ
操作。 我有时打开一个文件10次,只是因为我意外关闭了它,或者我想重新检查一下我刚刚读过的东西。 现在你会有10份?
我肯定会用Hans Passant的建议来创建一个关于更改/创建的副本。 根据定义,这种情况要少得多,因为你总是需要打开它来改变它,但打开它时不需要改变它。
第二个问题是检测到文件的读取。 现在用docx
可以检查隐藏文件的创建,如'〜$ _____。docx',但是这对PDF
不起作用。 也像你提到的,你将不得不检查整个磁盘。 没有其他办法了。 如果文件可以在任何文件夹中,则必须检查所有文件夹。 在服务中创建docx
和PDF
文件的内部列表可能会更快,但是您必须以设定的时间间隔再次循环每个文件,这取决于系统中有多少个文件。
所以,如果你真的需要检查read access
,一个文件系统驱动程序是你所有。 但是由于每个文件访问都会被调用,导致问题或者系统缓慢将成为市长关心的问题。
如果你仍然想,看看这个文件系统过滤器驱动教程 ,学习如何做到这一点。 就我个人而言,我不会去那里。
从我在评论中看到的文件系统监视器可能会工作得很好。 我不确定Search Everything是否使用了一个,但是如果是这样,我不会注意到任何影响。
另一个选项可能是Process Monitor使用的ETW – Windows事件跟踪 。 即使有数百万的变化,我也很难注意到这种影响。
我想要按照Hans Passant的建议去做Volume Shadow Copies, Alpha Volume Shadow Copies可能是一个合适的库,可以为它提供支持。
结论:虽然我承认分层存储管理系统的描述可能与您的方法相匹配,但将上传存储作为硬盘之后的下一个分层结构,可能并不需要过滤驱动程序,并且使您远离其他问题。