Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 特定文件类型的文件系统筛选器驱动程序_C#_C++_Windows_File Io_Filter Driver - Fatal编程技术网

C# 特定文件类型的文件系统筛选器驱动程序

C# 特定文件类型的文件系统筛选器驱动程序,c#,c++,windows,file-io,filter-driver,C#,C++,Windows,File Io,Filter Driver,我需要检测在整个windows文件系统中以任何方式访问两种文件类型中的任何一种 据我所知,要做到这一点而不会导致操作系统严重减速,唯一的方法是创建一个文件系统过滤器驱动程序 基本上我所需要做的就是复制任何打开的文档(x)文件和pdf。我决定采用这种方法,因为要么如此,要么在C#中使用文件监视器,这对整个驱动器都不起作用 我的问题有两个方面,有没有更简单的方法?第二,在访问每个doc(x)/pdf文件时,我如何简单地复制一份 该解决方案需要与我们当前生产的包一起部署 更新 我将对文件系统观察器进行

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

据我所知,要做到这一点而不会导致操作系统严重减速,唯一的方法是创建一个文件系统过滤器驱动程序

基本上我所需要做的就是复制任何打开的文档(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);
        }



    }
}

我认为在Read上创建一个拷贝会带来很多问题。例如:病毒扫描器。考虑以下内容:

  • 我打开文件“test.pdf”
  • 您的程序创建“test_copy.pdf”
  • 病毒扫描程序检测新文件并检查(读取)“test_copy.pdf”
  • 您的程序检测读访问,并创建“test\u copy\u copy.pdf”
  • 病毒扫描程序
  • 现在,您当然可以创建具有不同扩展名的副本来防止这种情况,但仍然会有很多
    读取
    操作。有时,我打开一个文件10次,只是因为我无意中关闭了它,或者我想重新检查刚读到的内容。现在,您将有10个副本

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

    第二个问题是检测对文件的读取。现在使用
    docx
    可以检查是否创建了像“~$\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux.docx”这样的隐藏文件,但这对
    PDF
    不起作用。同样,正如您提到的,您必须检查整个磁盘。没有办法可以绕过它。如果文件可以位于在服务中创建
    docx
    PDF
    文件的内部列表可能会更快,但由于您必须以设定的间隔再次循环遍历每个文件,这取决于系统上的文件数量

    因此,如果您真的需要检查
    读取访问
    ,那么您就只需要一个文件系统驱动程序。但是,由于每次文件访问都会调用它,因此导致问题或系统运行缓慢将是一个主要问题


    如果您还想,请查看此文件以了解如何操作。就我个人而言,我不会去那里。

    从我在评论中看到的内容来看,文件系统观察者可能会工作得很好。我不确定是否使用了它,但如果使用了,我不会注意到任何影响

    另一个选择可能是由使用。即使有数百万的变化,我也几乎没有注意到的影响

    我想按照Hans Passant的建议购买卷影副本,这可能是一个提供支持的合适库


    结论:可能不需要筛选器驱动程序,这样您就不会遇到其他问题,尽管我承认分层存储管理系统的描述可能与您的方法相匹配,将上载存储视为硬盘之后的下一个分层。

    嗨,Andrew,感谢您的回答不幸的是,整个系统都使用了文件系统驱动器会非常慢,我想不会吧?最重要的是,windows文件系统现在禁用了LastAccess,因此我在上面提到,它可能不会很好地工作!很抱歉,刚刚重读了我的上一条评论,结果有点粗鲁,我很感谢你的建议,但我认为FS watcher不会很好地工作。@MrkFldig:为什么不试试呢?一个FSW i这并不难实现。试一试,看看它是否满足您的性能需求。嗨,安德鲁,自从您第一次来到这里以来,我将奖励您50分。文件系统驱动程序唯一能为您购买的是一种阻止更新的方法,这样您就可以处理消防水管问题。但这样的驱动程序会造成您明显不喜欢的问题,serious系统速度变慢。您的要求非常奇怪,只有在访问文件时才创建副本。您甚至不能使用FSW来执行此操作,它是用来检测更改的。一个明智的选择是始终拥有副本。您应该查看卷影复制服务。如果您正在生成打开这些文件的包,为什么它不能创建副本打开文件时的副本?可能会让你找到你想要的答案。你考虑过WinAPI(PInvoke)吗?可能也会这样。你还需要定义“文件已访问”或“文件已打开”的确切含义?例如,从只关注文件系统中发生的事情的角度来看,记事本打开文件的方式与Word打开同一文件的方式非常不同。只需在目录上设置FSW,在.txt文件上测试记事本和Word,当您只需“打开”或“访问”它。记事本创建一个副本,只有当你保存它,Word创建了很多临时文件等。实际上我需要做的是注意一个新文件,并从我们的“托盘”上传它"应用程序到web服务。因此,您正在使用系统范围的dropbox文件夹构建dropbox?然后使用文件系统监视程序创建和更改事件并将其上载。您甚至可以在整个驱动器上执行文件系统监视程序吗?当然可以,但我建议您阅读有关内存使用情况的信息。谢谢您,我现在讨论的是,也许我应该找到一种监视打开文件的方法