如何在WPF应用程序中打开Windows资源管理器并导航到指定目录?

197
在一个WPF应用程序中,当用户单击按钮时,我想打开Windows资源管理器到某个目录,我该怎么做?
我希望实现的功能大概是这样:
Windows.OpenExplorer("c:\test");
5个回答

356
为什么不使用 Process.Start(@"c:\test");

10
注意:您也可以使用此方法运行其他应用程序。Process.Start("calc.exe");将会运行计算器。您可以传递可执行文件的完整路径,它将会运行该文件。 - Jamie Penney
1
哈哈,当然可以。有趣的是,我脑海中一直想着 Application.Run,无法使用普遍存在的 Process.Start,还以为 WPF 在和我玩游戏。 - Abel
18
如果没有找到该文件,它会抛出异常。如果您不想处理异常,请尝试使用Process.Start("explorer", @"c:\test");代替。它将打开一个默认窗口。然而通常最好处理异常。 - amalgamate
13
请注意,如果有恶意的人(或只是不知情的人)可以在那里获取任何字符串,他们将能够执行任何程序。@amalgamate建议更安全,否则请检查路径是否为目录并且是否存在。 - Christian Rondeau
5
Start(dir)Start("explorer.exe", dir) 之间的另一个区别是前者如果存在窗口已经打开了 dir 目录,它会聚焦到这个已有窗口,而后者则每次都会打开一个新窗口。 - dlf
显示剩余3条评论

64
Process.Start("explorer.exe" , @"C:\Users");

我必须使用这个方法,只指定目标目录的另一种方式会在我的应用程序终止时关闭资源管理器窗口。


13
我能理解的唯一答案是我没有收到“拒绝访问”异常。 - Matas Vaitkevicius
4
非常感谢,这个工作已经完美运行,没有出现“拒绝访问”的异常。 - AH.
3
如果你想让你的代码能跨平台运行,请使用 Process.Start(new ProcessStartInfo(your_path) { UseShellExecute = true })。它会使用你机器上默认的shell,而不是试图在基于Unix的操作系统中找到不存在的explorer.exe。 - Erhode
@Erhode UseShellExecute 默认不是已经设置为 true 了吗? - Nyerguds
1
根据 https://learn.microsoft.com/en-gb/dotnet/api/system.diagnostics.processstartinfo.useshellexecute?view=net-6.0,@Nyerguds对于.NET Framework应用程序,默认情况下将该值设置为true,而对于.NET Core应用程序,则设置为false。我不得不在我的最后一个.NET 6项目中添加它。 - Erhode

17

这应该可以运行:

Process.Start(@"<directory goes here>")

或者,如果您想要一种运行程序/打开文件和/或文件夹的方法:

private void StartProcess(string path)
{
    ProcessStartInfo StartInformation = new ProcessStartInfo();

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

然后调用该方法,在括号中放入文件和/或文件夹的目录,或应用程序的名称。希望这有所帮助!


打开文件夹。在“process.EnableRaisingEvents = true;”一行出现错误,因为 process 为空。 - Starwave
@Starwave 首先创建 Process 对象,设置其 EnableRaisingEvents 属性,然后再启动它? - Nyerguds

13

您可以使用System.Diagnostics.Process.Start

或者直接使用WinApi,例如以下代码将启动explorer.exe。您可以使用ShellExecute的第四个参数指定起始目录。

public partial class Window1 : Window
{
    public Window1()
    {
        ShellExecute(IntPtr.Zero, "open", "explorer.exe", "", "", ShowCommands.SW_NORMAL);
        InitializeComponent();
    }

    public enum ShowCommands : int
    {
        SW_HIDE = 0,
        SW_SHOWNORMAL = 1,
        SW_NORMAL = 1,
        SW_SHOWMINIMIZED = 2,
        SW_SHOWMAXIMIZED = 3,
        SW_MAXIMIZE = 3,
        SW_SHOWNOACTIVATE = 4,
        SW_SHOW = 5,
        SW_MINIMIZE = 6,
        SW_SHOWMINNOACTIVE = 7,
        SW_SHOWNA = 8,
        SW_RESTORE = 9,
        SW_SHOWDEFAULT = 10,
        SW_FORCEMINIMIZE = 11,
        SW_MAX = 11
    }

    [DllImport("shell32.dll")]
    static extern IntPtr ShellExecute(
        IntPtr hwnd,
        string lpOperation,
        string lpFile,
        string lpParameters,
        string lpDirectory,
        ShowCommands nShowCmd);
}

这些声明来自于 pinvoke.net 网站


1
是的,我一直在追踪错误,不知道<strike>删除线</strike>,顺便说一句很酷。 - Edward Tanguay
1
非常遗憾,该功能只适用于回答和问题,而不适用于评论;-)。我刚刚更新了。 - Abel
你在前两句话中说的可以从WinForms应用程序中运行"explorer.exe"的方法是不起作用的。因为Application.Run甚至不接受字符串参数。 - barlop
1
由于使用了非托管资源,我应该将此使用包装在另一个实现 IDisposable 的类中吗? - LuckyLikey
1
@LuckyLikey,是的,这通常是一个好主意和良好的设计实践。 - Abel
显示剩余2条评论

0
这是我的解决方案:
基本上使用命令行调用“start C:/path”,然后退出终端,所以“start c:/path && exit”。
WindowsExplorerOpen(@"C:/path");

        public static void WindowsExplorerOpen(string path)
        {
            CommandLine(path, $"start {path}");
        }

        private static void CommandLine(string workingDirectory, string Command)
        {
            ProcessStartInfo ProcessInfo;
            Process Process;

            ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + Command + " && exit");
            ProcessInfo.WorkingDirectory = workingDirectory;
            ProcessInfo.CreateNoWindow = true;
            ProcessInfo.UseShellExecute = true;
            ProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;

            Process = Process.Start(ProcessInfo);
            Process.WaitForExit();
        }

对我来说,这两个都没有起作用:

Process.Start(@"c:\test");
Process.Start("explorer.exe" , @"C:\Users");

Windows找不到路径,请再次检查名称。 - MindRoasterMir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接