双击任何文件时如何引发事件

时间:2018-08-20 05:36:45

标签: c# file events

当我双击Windows文件夹中的文件时,我想编写/捕获事件。假设我们在txt中有一些D:\MyTest\Example1.txt文件

当我双击该文件时,该文件不应打开,而应触发event/trigger/service来执行某些任务。

我在{strong> C#中尝试了FileSystemWatcher。但是,当我双击该文件时,该文件正在打开。(不应)。

下面提供了一个便于您更好理解的简单要求。

在Windows中双击任何txt文件时,它应调用一个简单的批处理文件(例如:a.bat)以显示今天的日期。 条件:双击该文件时,.bat文件应运行而无需打开实际的txt文件。

1 个答案:

答案 0 :(得分:0)

FileSystemWatcher监视任何文件添加/删除/修改而不是文件执行的特定路径。

根据您的需求有不同的解决方案:

  • 最简单的解决方案是为自己的文件扩展名注册程序。通过双击文件,您的程序已执行,您可以将其记录下来,不再执行任何操作,或者使用实际程序打开请求的文件。例如“ Notepad.exe 1.txt”

  • 编写了一个hook模块并将其加载到资源管理器的进程中,并监视文件执行,但是此解决方案的主要缺点是第三方应用程序或打开程序中没有意义的文件的技巧。例如使用CMD.exe或PowerShell.exe打开文本文件,因为您监视特定的程序。

  • 您可以将hook模块插入所有可执行文件中,但是可能会导致性能问题。

  • 困扰的解决方案是编写MiniFilter驱动程序来监视文件系统,但它需要良好的系统,用户模式,c ++和驱动程序开发知识。

  • 可以实现虚拟文件系统并对其进行控制,并且再次需要驱动程序开发,但是现有库具有良好的C#端口,C#最好的端口是Dokan .Net

描述最简单的实现方式:

  1. 编写没有任何形式的简单程序:
static void Main(string[] args)
{
    if (!args.Any())
        return;

    foreach (string argument in args)
    {
        if (Path.GetExtension(argument) != "txt")
            continue;

        if (Path.GetDirectoryName(argument) == @"D:\MyTest\")
        {
            // Call your service event here
            return;
        }

        Process.Start("Notepad.exe", argument);
    }
}
  1. 使用注册表配置为自己的文件扩展名注册程序(在您的情况下为.txt)。 Here is Microsoft documentation也许还有this topic会为您提供帮助。

  2. 现在,通过双击.txt文件,您的程序被执行,文件路径作为参数传递给您的程序。程序检查每个文件,如果需要,您可以使用不同的机制(例如管道或消息等)调用某些内容或通知服务。 如果文件不匹配,则需要调用原始应用程序(在我的示例代码“ nodepad.exe”中),并且文件可以正常打开。