Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# 我怎样才能展示“我的”呢;以“打开”;文件对话框?_C# - Fatal编程技术网

C# 我怎样才能展示“我的”呢;以“打开”;文件对话框?

C# 我怎样才能展示“我的”呢;以“打开”;文件对话框?,c#,C#,有什么简单的方法可以打开“用文件打开”对话框吗?这应该可以做到 var processInfo = new ProcessStartInfo(fileName); processInfo.Verb = "openas"; Process.Start(processInfo); 尽管如此,Oded提出了一个很好的观点——不知道您打算如何/在哪里使用这些功能意味着这可能不是您的情况的答案 最近对这个答案的评论表明,我一开始并不是很详细。如果您尝试openas一个已经针对该类型文件定义了open动词

有什么简单的方法可以打开“用文件打开”对话框吗?

这应该可以做到

var processInfo = new ProcessStartInfo(fileName);
processInfo.Verb = "openas";
Process.Start(processInfo);
尽管如此,Oded提出了一个很好的观点——不知道您打算如何/在哪里使用这些功能意味着这可能不是您的情况的答案

最近对这个答案的评论表明,我一开始并不是很详细。如果您尝试
openas
一个已经针对该类型文件定义了
open
动词的文件,则会出现问题。类似地,如果您试图
打开
一个没有定义该动词的文件,就会出现问题。问题是:

Win32Exception:没有应用程序与此操作的指定文件关联

我不假思索地向Thomas建议,为了在生产应用程序中使用此类代码,您需要彻底检查注册表,或者以其他方式确定文件是否可以并且应该使用任何给定动词打开。当你考虑到:一旦代码<>代码>被设置,它将为你提供一个与文件类型相关联的可能的动词集合。这样可以更容易地确定如何处理哪个文件

总而言之,正如我向Thomas提到的,您需要小心,并为您的应用程序添加一些复杂性/智能性-这个答案当然不是一个包罗万象的解决方案。

有大量的解决方案。也许你可以看看它们,看看一个例子是否有你想要的函数。

使用

System.Diagnostics.Process.Start(path);
文件将使用默认程序打开,如果未定义默认程序,将显示“使用打开”对话框

您可以使用以下功能:

[DllImport("shell32.dll", SetLastError = true)]
extern public static bool 
       ShellExecuteEx(ref ShellExecuteInfo lpExecInfo);

您有一个使用此函数的示例:

一些使用ProcExp的反向工程显示了一个运行的rundll32.exe命令行。下面是一个使用它的示例程序:

using System;
using System.Diagnostics;
using System.IO;

class Program {
    static void Main(string[] args) {
        ShowOpenWithDialog(@"c:\temp\test.txt");
    }
    public static void ShowOpenWithDialog(string path) {
        var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll");
        args += ",OpenAs_RunDLL " + path;
        Process.Start("rundll32.exe", args);
    }
}

在Win7上测试,我无法猜测这在其他版本的Windows上会有多好。

Winforms?WPF?网络表单?MVC?CodeProject有一篇文章在搜索谷歌时排名第一:。然而,我希望看到一种更漂亮的方法来实现这一点,而不是求助于外部(
ProcessStartInfo
,也许吧?),这不管用。。。Win32Exception,“没有应用程序与此操作的指定文件关联”@thomaslevsque只有在未定义“默认程序”的情况下,它才会工作;也就是说,如果文件有一个
openwith…
上下文菜单,则此操作将失败。如果它是一个未知的文件类型,只需一个
打开
选项,那么这将起作用。反之亦然:对已知文件类型使用
open
动词将启动默认程序,但如果未知,则会引发相同的异常。因此,在一个适当的应用程序中,您需要彻底了解这一点;可能在已知文件类型repo(注册表)中进行查找,并根据系统给出的事实决定如何打开。@Thomaslevsque事实上,您甚至不需要这么长:当设置
文件名时,将填充文件的可能动词,这意味着您只需检查
open
动词是否已定义,如果未定义,则使用
openas
。我敢打赌,这并不能涵盖所有情况,所以请随意添加您自己的聪明。谢谢@thomasleveque,这对我非常有用。使用
ErrorDialog
,您可以在文件系统中打开未关联的文件,就像从windows资源管理器中的文件夹中打开文件一样,显示用于浏览应用程序的对话框。如果没有此功能,我的应用程序在打开未关联的文件时会崩溃。-1我的理解是,只有当文件没有默认应用程序时,此功能才有效,这与调用进程没有任何区别。从文件名本身开始。我错过什么了吗?谢谢你,汉斯!我绕着灌木丛转了一会儿,这就是我所需要的。我没有使用shell32.dll的完整路径。请注意,
OpenAs\u RunDLL
没有文档记录,我将用Environment.SystemDirectory替换Environment.GetFolderPath(Environment.SpecialFolder.System)。这是一个老问题(但仍然相关!),但哈里·约翰斯顿(Harry Johnston)在其链接评论中使用的
SHOpenWithDialog
的回答是我认为更好的答案。话虽如此,我在Win10 1909上尝试了Han的答案,它在我测试的少数类型上运行良好。