Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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# doc open C的文件系统钩子_C#_Ms Word_Filesystems - Fatal编程技术网

C# doc open C的文件系统钩子

C# doc open C的文件系统钩子,c#,ms-word,filesystems,C#,Ms Word,Filesystems,我正在编写一个应用程序,需要通知打开的每个文档文件,我尝试过使用FileSystemWatcher,但最近由于开销太大,NotifyFilter.LastAccess似乎被禁用 我想我可以使用LastWrite,但这意味着我需要尝试从word打开文档时创建的临时文件中找出原始文件名 我还需要监视4个目录,所以理想情况下我不想轮询它们 我知道我可以写一个WordAddin,这是一个选项,但这意味着要管理另一个部署,要支持另一个代码库和另一个产品,还有一个问题,即许多用户总是将Addin视为慢行的根

我正在编写一个应用程序,需要通知打开的每个文档文件,我尝试过使用FileSystemWatcher,但最近由于开销太大,NotifyFilter.LastAccess似乎被禁用

我想我可以使用LastWrite,但这意味着我需要尝试从word打开文档时创建的临时文件中找出原始文件名

我还需要监视4个目录,所以理想情况下我不想轮询它们

我知道我可以写一个WordAddin,这是一个选项,但这意味着要管理另一个部署,要支持另一个代码库和另一个产品,还有一个问题,即许多用户总是将Addin视为慢行的根源

有没有一种简单的方法告诉windows Vista Up我想知道关于已打开的doc或docx的信息

我想知道的一件事是,我是否可以将与.doc关联的默认程序更改为我的,它作为服务运行,然后通过它将详细信息传递给我打开?这看起来有点像黑客,所以我想知道是否有一种简单的方法可以钩住这些类型的文件打开

更新

通过与不同的人讨论,最可靠的方法和最有效的资源似乎是替换现有的.doc.&文件关联。docx到我自己的程序,然后使用Microsoft.Office.Interop.Word启动Word,然后连接到DocumentOpen事件


通过这种方式,我可以获得正在打开的文件名以及将来在word中打开的任何文档。

如果我没有记错,在同一文件夹中创建的临时文件的文件名格式为~$+filename,例如:

~$very\u important\u file.doc

它包含打开文件的用户的名称。请注意,该文件具有“隐藏”属性集


这使得确定哪个文档实际打开以及由谁打开变得非常容易。

这些任务通常使用文件系统过滤器驱动程序来完成。Procmon就是这样工作的。您可以创建自己的筛选驱动程序或使用预创建的筛选驱动程序,例如我们的CallbackFilter。

请注意,如果您将.doc/docx重新关联到自己的应用程序,则如果用户打开Word,然后使用Word UI选择文件并打开它,则不会通知您。ProcMon可以执行您需要的操作。那么问题是,ProcMon是如何做到的?我不知道,但答案可能就在某个地方。Hrm很好,我没有想到从word内部打开文件,你确定它仍然没有进行查找吗?我想这不是真的。Lemmy看一看procmonHmm事实上如果你通过interop程序集打开word你就可以连接到fileopen对话中不?我不熟悉word interop,但这听起来很有希望。我认为是这样的,但它将前两个字符重命名为~$,因此确定打开了什么并不是100%可靠。如果没有扩展名的文件名短于7个字符,它会在~$前面加上前缀,如果文件较长,它会开始替换第一个或前两个字符。如果有多个文件的文件名超过8个字符,并且仅前两个字符不同,则可能会出现问题Word在这些情况下仅为两个文档创建一个临时文件shrm我想这是一种可能性,我很惊讶没有一个简单的方法可以挂接到文件打开,虽然感谢alpha,我在c:\users\which上使用了fs watcher,但我认为过滤器驱动程序将是生产的方式