Comment puis-je ouvrir l'Explorateur Windows dans un certain répertoire à partir d'une application WPF?

150

Dans une application WPF, lorsqu'un utilisateur clique sur un bouton, je souhaite ouvrir l'explorateur Windows dans un certain répertoire, comment faire?

Je m'attendrais à quelque chose comme ça:

Windows.OpenExplorer("c:\test");
Edward Tanguay
la source

Réponses:

306

Pourquoi pas Process.Start(@"c:\test");?

Jamie Penney
la source
9
Remarque: vous pouvez également l'utiliser pour exécuter d'autres applications. Process.Start("calc.exe");exécutera la calculatrice. Vous pouvez lui transmettre le chemin complet d'un exécutable et il l'exécutera.
Jamie Penney
1
LOL, oui, pourquoi pas. Drôle, j'avais Application.Run dans ma tête, je ne pouvais pas accéder à l'omniprésence Process.Start et je pensais que WPF jouait à des jeux avec moi.
Abel
9
Remarque: il lèvera une exception s'il n'y est pas. Essayez Process.Start ("explorer", @ "c: \ test"); à la place, si vous ne souhaitez pas gérer l'exception. Cela ouvrira une fenêtre par défaut. Cependant, il sera souvent préférable de gérer l'exception.
fusionner le
9
Attention, si une personne malveillante (ou tout simplement inconsciente) peut y trouver une chaîne, elle pourra exécuter n'importe quel programme. La suggestion @amalgamate est plus sécurisée, sinon vérifiez si le chemin est un répertoire et s'il existe avant.
Christian Rondeau
3
Une autre différence entre Start(dir)et Start("explorer.exe", dir)est que le premier sera suffisamment intelligent pour concentrer la fenêtre existante dirs'il y en a une, tandis que le second ouvre une nouvelle fenêtre à chaque fois.
dlf
13

Cela devrait fonctionner:

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

Ou si vous souhaitez une méthode pour exécuter des programmes / ouvrir des fichiers et / ou des dossiers:

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

    StartInformation.FileName = path;

    Process process = Process.Start(StartInformation);

    process.EnableRaisingEvents = true;
}

Et puis appelez la méthode et entre parenthèses, mettez soit le répertoire du fichier et / ou du dossier, soit le nom de l'application. J'espère que cela a aidé!

Anthony Smyth
la source
12

Vous pouvez utiliser System.Diagnostics.Process.Start.

Ou utilisez WinApi directement avec quelque chose comme ce qui suit, qui lancera explorer.exe. Vous pouvez utiliser le quatrième paramètre de ShellExecute pour lui donner un répertoire de départ.

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);
}

Les déclarations proviennent du site pinvoke.net .

Abel
la source
1
oui, je recevais des erreurs en poursuivant cela, je ne savais pas à propos de <strike> strike </strike> btw cool
Edward Tanguay
1
qui, malheureusement, ne fonctionne que dans les réponses / questions, mais pas dans les commentaires ;-). Je viens de mettre à jour.
Abel
+1 J'utiliserai ce code pour lancer d'autres applications, mais Process.Start () était exactement ce dont j'avais besoin.
Edward Tanguay
c'est ce qui arrive lorsque vous essayez de répondre q. a 3h du matin: vous manquez l'évidence ;-). Quoi qu'il en soit, je me souviens que j'utilise souvent ShellExecute lorsque Process.Start ne fait pas ce que je veux (il y a quelques scénarios qu'il ne peut pas gérer).
Abel
ce que vous (dans les deux premières phrases), avez dit fonctionnerait à partir d'une application winforms, Application.Run ("explorer.exe") ne fonctionne pas. Parce que application.run ne prend même pas de chaîne
barlop
12
Process.Start("explorer.exe" , @"C:\Users");

Je devais l'utiliser, l'autre façon de spécifier simplement le répertoire tgt fermait la fenêtre de l'explorateur lorsque mon application se terminait.

MarkyMarksFunkyBunch
la source
La seule réponse que je n'obtiens pas d' Access deniedexception.
Matas Vaitkevicius