如何从 WPF 应用程序中打开 Windows 资源管理器到某个目录?

Posted

技术标签:

【中文标题】如何从 WPF 应用程序中打开 Windows 资源管理器到某个目录?【英文标题】:How can I open Windows Explorer to a certain directory from within a WPF app? 【发布时间】:2010-12-17 07:03:31 【问题描述】:

在 WPF 应用程序中,当用户单击按钮时,我想将 Windows 资源管理器打开到某个目录,我该怎么做?

我希望是这样的:

Windows.OpenExplorer("c:\test");

【问题讨论】:

【参考方案1】:

这对我有用:

基本都是用命令行调用“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");

【讨论】:

【参考方案2】:

这应该可行:

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; 线上出现错误,因为进程为空。【参考方案3】:
Process.Start("explorer.exe" , @"C:\Users");

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

【讨论】:

我没有得到Access denied异常的唯一答案。 这在没有“访问被拒绝”异常的情况下完美运行。谢谢。【参考方案4】:

您可以使用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 website。

【讨论】:

是的,我在追逐那个时遇到了错误,不知道 strike 顺便说一句很酷 不幸的是,它仅适用于答案/问题,但不适用于 cmets ;-)。我刚刚更新了。 +1 我将使用此代码来启动其他应用程序,但 Process.Start() 正是我所需要的。 由于使用了非托管资源,我是否应该将此使用包装在另一个实现 IDisposable 的类中? @LuckyLikey,是的,这通常是一个好主意和良好的设计实践。【参考方案5】:

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

【讨论】:

注意:您也可以使用它来运行其他应用程序。 Process.Start("calc.exe"); 将运行计算器。您可以将完整路径传递给可执行文件,它会运行它。 哈哈,是的,为什么不呢。有趣的是,我的脑海中有 Application.Run,​​无法进入无处不在的 Process.Start 并认为 WPF 正在和我玩游戏。 注意:如果不存在会抛出异常。尝试 Process.Start("explorer", @"c:\test");相反,如果您不想处理异常。它将打开一个默认窗口。然而,处理异常通常会更好。 请注意,如果有人恶意(或只是不知道)可以在那里获取任何字符串,他们将能够执行任何程序。 @amalgamate 建议更安全,否则检查路径是否为目录以及之前是否存在。 Start(dir)Start("explorer.exe", dir) 之间的另一个区别是前者足够聪明,可以将现有窗口聚焦到dir(如果有),而后者每次都会打开一个新窗口。

以上是关于如何从 WPF 应用程序中打开 Windows 资源管理器到某个目录?的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 开始菜单打开 WPF 应用程序时崩溃

如何将 WPF 应用程序项目连接到 Windows 游戏项目?

如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?

如何从 WPF 访问 Windows.Devices.Scanners

如何允许从 Windows 资源管理器拖放到 C# WPF 应用程序中?

如果打开一个对话框,则始终启用WPF拖放