C# 特定文件类型的文件系统筛选器驱动程序
我需要检测在整个windows文件系统中以任何方式访问两种文件类型中的任何一种 据我所知,要做到这一点而不会导致操作系统严重减速,唯一的方法是创建一个文件系统过滤器驱动程序 基本上我所需要做的就是复制任何打开的文档(x)文件和pdf。我决定采用这种方法,因为要么如此,要么在C#中使用文件监视器,这对整个驱动器都不起作用 我的问题有两个方面,有没有更简单的方法?第二,在访问每个doc(x)/pdf文件时,我如何简单地复制一份 该解决方案需要与我们当前生产的包一起部署 更新C# 特定文件类型的文件系统筛选器驱动程序,c#,c++,windows,file-io,filter-driver,C#,C++,Windows,File Io,Filter Driver,我需要检测在整个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上创建一个拷贝会带来很多问题。例如:病毒扫描器。考虑以下内容:
读取
操作。有时,我打开一个文件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?然后使用文件系统监视程序创建和更改事件并将其上载。您甚至可以在整个驱动器上执行文件系统监视程序吗?当然可以,但我建议您阅读有关内存使用情况的信息。谢谢您,我现在讨论的是,也许我应该找到一种监视打开文件的方法