如何显示“打开方式”文件对话框?

时间:2011-01-18 16:30:12

标签: c#

有没有简单的方法可以打开“打开方式”文件对话框?

4 个答案:

答案 0 :(得分:22)

使用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有多好。

答案 1 :(得分:10)

应该这样做......

var processInfo = new ProcessStartInfo(fileName);
processInfo.Verb = "openas";
Process.Start(processInfo);

虽然,Oded提出了一个很好的观点 - 不知道您打算如何/在何处使用此类功能意味着这可能不适合您的情况。

最近对这个答案的评论表明我起初并不是很详细。如果您尝试openas已经针对该类型的文件定义了open谓词的文件,则会出现问题。同样,如果你尝试open一个没有定义动词的文件,那就会有麻烦。问题是:

  

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

在我的脑海中,我向Thomas建议,为了在生产应用程序中使用这种代码,您需要彻底检查注册表,或者查看文件是否能够和应该用任何给定的动词打开。当你考虑ProcessStartInfo.Verbs时,它可能比那更简单:一旦fileName被设置,这将为你提供与文件类型相关的可能动词的集合。这样可以更容易地确定如何处理哪个文件。

总结一下,正如我向托马斯提到的那样,你需要注意并为你的应用程序添加一些复杂性/智能 - 这个答案肯定不是一个全能的解决方案。

答案 2 :(得分:2)

使用

System.Diagnostics.Process.Start(path);

该文件将使用默认程序打开,如果未定义默认程序,将显示打开对话框。

您可以使用该功能:

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

您可以在this link

上使用此功能

答案 3 :(得分:-3)

shell examples中有All In One Code Framework吨。也许你可以看看它们,看看一个例子是否具有你想要的功能。