在Windows中,当我在Windows资源管理器中双击文件时会发生什么?

RLH*_*RLH 14 .net c# windows windows-explorer

TL; DR

当用户双击或选择文件并Enter从Windows资源管理器中按下键时,正在执行的确切的低级内核和OS调用是什么?


细节

这似乎是一个相当奇怪的问题,但我很好奇从Windows资源管理器打开文件的非常"细节"细节.

具体来说,我想知道的是当用户双击或选择文件并Enter在Windows资源管理器中按下键时正在执行的确切的低级内核和OS调用.

我问的原因是因为我有一个应用程序允许用户根据存储在数据库中的元数据浏览和搜索文件.当用户单击Open我提供的按钮时,我启动一个进程,其中根文件是已选择文件的路径.此外,值得一提的是这些文件位于网络共享上.

这已经工作了多年,但是,最近我的公司已经迁移到一个新的Active Directory服务器,现在应用程序被破坏了一小部分用户(1-2%).真奇怪的是这些用户无法打开来自我的应用程序的此文件,但他们可以浏览到该位置并从Windows资源管理器中打开它.当我的应用程序尝试打开该文件时,它会得到一个非常通用的异常,指出无法找到该文件.

我已经三次检查了应用程序正在使用的路径(对于多个文件)并且路径不正确.我已经验证我的用户在打开文件之前已经连接到这些网络驱动器.一切都设置正确,应该工作,但我的应用程序(或System.Process)不能"看到"或打开这些文件.

什么是Windows资源管理器应用程序System.Process与在应用程序中使用不同的做法?


对于那些在回答之前必须有代码的人,这里是我用来打开文件的特别简洁的代码.同样,这已经工作了多年,而且据我所知,你是如何让Windows从.Net中打开文件的.

//From within my Button-Click Event...
string file = e.Cell.Value.ToString();
try
{
    Process p = new Process();
    p.StartInfo.FileName = file;
    p.StartInfo.Verb = "Open";
    p.Start();
} 
catch (Exception ex)
{
    MessageBox.Show("A problem has occurred while trying to open the doccument."
    + "Please make sure that the file below exists and that you have permission " 
    + "to view it."
    + Environment.NewLine + Environment.NewLine
    + file
    + Environment.NewLine + "---------------" + Environment.NewLine  +
    ex.Message

    );
    //ex.Message states "The system cannot find the file specified"
}
Run Code Online (Sandbox Code Playgroud)

还有一件事.我在SO上发现了这个问题,但它没有/不应该适用于这个问题.我的应用程序只是试图打开PDF和一些工程图纸文件.没什么好看的,它不应该要求管理员访问.此外,我不认为应该要求任何用户身份验证,因为大多数用户从未收到此消息,并且他们已经通过登录并浏览到网络位置在网络上验证了自己.

Han*_*ant 6

一种非常常见的故障模式,并且存在于您的代码中,并未正确设置ProcessStartInfo.WorkingDirectory.程序的一个子集依赖于Explorer将默认工作目录设置为包含该文件的目录,并在未设置时覆盖.他们会做一些不明智的事情,比如试图在没有指定完整路径名的情况下打开配置文件,这只有在工作目录设置正确的情况下才有效.

你这样解决它:

Process p = new Process();
p.StartInfo.FileName = file;
p.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(file);
p.Start();
Run Code Online (Sandbox Code Playgroud)

这假设你没有犯错误,没有指定文件的完整路径名.


ole*_*sii 6

当用户双击或选择文件并在Windows资源管理器中按Enter键时,正在执行的确切的低级内核和OS调用是什么?

你可以自己测试一下.我是这样做的:一个示例C#程序代码

class Program
{
    static void Main(string[] args)
    {

    }        
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以从预定位置运行此应用程序.然后,您可以使用SysInternals的ProcMon应用程序来观察低级别调用.这是由我的机器上的ProcMon生成的csv文件的快照.我只放了一个过滤器来包含path到文件中,这是c:\test.exe

"Time of Day","Process Name","PID","Operation","Path","Result","Detail"
"14:57:55.3495633","Explorer.EXE","2568","CreateFile","C:\Test.exe","SUCCESS","Desired Access: Generic Read, Disposition: Open, Options: Open Requiring Oplock, Attributes: N, ShareMode: Read, AllocationSize: n/a, OpenResult: Opened"
"14:57:55.3498808","Explorer.EXE","2568","FileSystemControl","C:\Test.exe","SUCCESS","Control: FSCTL_REQUEST_FILTER_OPLOCK"
"14:57:55.3507711","Explorer.EXE","2568","CreateFile","C:\Test.exe","SUCCESS","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened"
...
Run Code Online (Sandbox Code Playgroud)

pastebin上可以使用完整版的csv .csv文件中的每一行都对应一个低级别调用,另外还有一些由于路径上的严格过滤而被排除的绒毛.