CSharp - 在 Windows 浏览器中,在 Windows 中,双击文件时发生了什么?

  显示原文与译文双语对照的内容
0 0

TL ;DR

有哪些确切的,低级别内核& os调用被执行当用户双击或选择一个文件,然后按下Enter键从Windows资源管理器内?


Details

这段代码可能会比较奇怪的问题,但我想了解这项非常" nitty坚韧不拔" 从Windows资源管理器打开文件的详细信息。

具体而言,我想知道的是确切的,低级别内核& os调用被执行当用户双击或选择一个文件,然后按下 Enter键从Windows资源管理器内。

之所以问是因为我休假的应用程序允许用户基于浏览并搜索文件的元数据存储在数据库中。 当用户单击 Open按钮,我已经提供了,我启动进程在根文件的文件的路径已被选取。 另外,值得一提的是,这些文件在网络上共享。

但这已工作了年,最近我的公司现在已经被移植到新活动目录服务器和应用程序就断了很小只有少数用户( 1 2% 。) 非常奇怪一件事是这些用户不能打开此文件从我的应用程序,但可以浏览到置并在此位置Windows资源管理器。 当我的应用程序试图打开文件时,它获取一个非常普通的异常,指出找不到的文件。

我检查路径的应用程序正在使用3 遍( 对于多文件) 和路径不正确。 我确认了我个人的用户,并被连接到这些网络驱动器,然后打开文件。 一切都设置正确,应该工作,但我的应用程序( 或 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"
}

还有一件事。 这个问题我发现 模式,使但doesnt/should不适用于这个问题。? 我的应用只是尝试打开PDF和一些工程图形文件。 没什么特别的,并且不应该需要admin访问。 另外,我不相信任何用户身份验证应该是必须的,因为网络上的大多数用户不会收到此消息然后自己已经验证通过登录并浏览到网络位置。

时间:原作者:9个回答

0 0

有哪些确切,低级别内核& os调用时正在执行的用户双击或选择一个文件并按Enter键从Windows资源管理器内?

自己可以对它进行测试。 我做的方法如下: 一个样例C#程序代码

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

现在可以运行这个应用程序从predifined位置。 然后你可以使用 ProcMon 应用程序从SysInternals以观察低级别调用。 下面是一个生成的csv文件的快照是ProcMon在我的机器上。 我已经把过滤器仅包含 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"
...

完整版本的csv上有 pastebin 。 csv文件中每一行对应于低级别调用,加上还有别的绒毛哪些被排除由于严格过滤路径。

原作者:
0 0

很常见的故障模式,并在代码中存在,不设置ProcessStartInfo .WorkingDirectory正常。 一部分程序依赖于Explorer修改过的工作目录设置为包含该文件所在的目录,然后摔倒了未设置该属性时。 他们会做些欠考虑的像要打开的config文件而无需指定完整路径名,只能工作在工作目录是否设置正确。

你修复它,如下所示:

Process p = new Process();
p.StartInfo.FileName = file;
p.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(file);
p.Start();

它假定你不会同样的错误犯不指定 文件的全路径名。

原作者:
0 0

你" tl ;DR " 问题是简明扼要但我不知道回答这个问题会解决你的问题。 汉斯Passant的回答可能是有用得多。 不过我将尝试提供一点信息。

windows有几个图层和在这种情况下,两个有趣的图层 Windows Shell API和 System Services API 。 你使用的是 Process.Start()最好能够调用ShellExecuteEx在Windows Shell 。 Windows Shell提供抽象之上Windows如果你有一台桌面( 特别是一些磁盘上的文件夹),文件将被视为文档与Icon和谓词来对这些文档进行操作。 如果你正在使用中 Open动词。

Windows Shell很复杂,而且可以扩展什么 ShellExecuteEx是做为特定路径和动词的遗书容易回答。 这要看什么是在本地计算机上注册。 但是,如果文件是PDF文件和该谓词 Open你可能以为shell会运行任意应用程序与之关联。 .PDF扩展名在注册表中。

在Windows 7 可以检查和修改文件在 assocations控制面板 > Programs > Default Programs > Set Associations 。 我怀疑如果程序关联的 .PDF扩展名丢失可能会得到 FileNotFoundException但我还没确认的。

如果shell认定应执行应用程序会在某个时刻调用System Services图层并使用CreateProcess函数来创建新进程。 对于PDF文件( 取决于的注册信息 .PDF) 进程执行 Acrobat.exe与单个命令行参数( 将创建你指定的文件) 。

要解决该问题,可以在命令提示符下写入 file.pdf( 文件必须存在) 和shell是否能够打开PDF文件。

原作者:
0 0

你可以尝试下面这个使用 FileSystemInfo .FullName

string file = e.Cell.Value.ToString();
var fileInfo = new FileInfo(Path.Combine(System.IO.Path.GetDirectoryName(file) + file));
if (!fileInfo.Exists)
{
    throw new FileNotFoundException(fileInfo.FullName + " was not found");
}
System.Diagnostics.Process.Start(fileInfo.FullName);
原作者:
...