繁体   English   中英

特定文件类型的文件系统过滤器驱动程序

[英]File system filter driver for specific file types

我需要检测何时在整个 Windows 文件系统中以任何方式访问两种文件类型中的任何一种。

据我了解,在不导致操作系统严重减速的情况下执行此操作的唯一方法是创建文件系统过滤器驱动程序?

基本上我需要做的就是复制所有打开的 doc(x) 文件和 pdf。 我决定采用这种方法,因为它要么使用 C# 中的文件监视器,要么对整个驱动器无效。

我的问题是双重的,有没有更简单的方法,其次我将如何在访问每个 doc(x)/pdf 文件时简单地复制它?

该解决方案需要可与我们当前生产的包一起部署。

更新

我将对文件系统观察器进行基准测试,在与这里的人讨论之后,我认为它可能是可以接受的,我担心的是我需要监视将发生下载的常见用户目录(所以“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);
        }



    }
}

我认为在读取时创建副本会导致很多问题。 例如:病毒扫描程序。 考虑以下:

  1. 我打开文件“test.pdf”
  2. 您的程序创建“test_copy.pdf”
  3. 病毒扫描程序检测新文件并检查(读取)“test_copy.pdf”
  4. 您的程序检测读取访问,并创建“test_copy_copy.pdf”
  5. 病毒扫描...

现在您当然可以创建具有不同扩展名的副本来防止这种情况发生,但仍然会有很多文件的READ操作。 我有时会打开一个文件 10 次,只是因为我不小心关闭了它,或者我想重新检查我刚刚阅读的内容。 现在你会有10份?

我肯定会同意 Hans Passant 关于在更改/创建时创建副本的建议。 根据定义,这种情况发生得少得多,因为您总是需要打开它来更改它,但不必在打开它时更改它。

第二个问题是检测对文件的读取。 现在使用docx您可以检查是否创建了像 '~$_____.docx' 这样的隐藏文件,但这不适用于PDF 同样像您提到的那样,您必须检查整个磁盘。 没有其他办法了。 如果文件可以位于任何文件夹中,则必须检查所有文件夹。 在服务中创建docxPDF文件的内部列表可能会更快,但由于您必须以设定的时间间隔再次循环遍历每个文件,这取决于系统上有多少文件。

因此,如果您确实需要检查read access ,那么您只需要一个文件系统驱动程序即可。 但是由于它会在每次文件访问时被调用,导致问题或系统缓慢将是一个主要问题。

如果您仍然想要,请查看此文件系统过滤器驱动程序教程以了解如何操作。 就我个人而言,我不会去那里。

从我在评论中读到的内容来看,文件系统观察程序可能会运行良好。 我不确定Search Everything是否使用了一个,但如果使用了,我不会注意到任何影响。

另一种选择可能是Process Monitor使用的ETW-Windows 事件跟踪 即使有数以百万计的变化,我也几乎察觉不到影响。

如果您想使用 Hans Passant 提出的Volume Shadow CopiesAlpha Volume Shadow Copies可能是一个合适的库,为其提供支持。

结论:可能不需要过滤器驱动程序并让您远离其他问题,尽管我承认分层存储管理系统的描述可能符合您的方法,将上传存储视为硬盘之后的下一个层次结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM