it-swarm.com.de

Öffnen Sie einen Ordner im Explorer und wählen Sie eine Datei aus

Ich versuche, einen Ordner im Explorer mit einer ausgewählten Datei zu öffnen.

Mit dem folgenden Code wird eine Ausnahme "Datei nicht gefunden" generiert:

System.Diagnostics.Process.Start(
    "Explorer.exe /select," 
    + listView1.SelectedItems[0].SubItems[1].Text + "\\" 
    + listView1.SelectedItems[0].Text);

Wie kann ich diesen Befehl in C # ausführen lassen?

136
Michael L

Verwenden Sie diese Methode :

Process.Start(String, String)

Das erste Argument ist eine Anwendung (Explorer.exe), das zweite Methodenargument sind Argumente der von Ihnen ausgeführten Anwendung.

Beispielsweise:

in CMD:

Explorer.exe -p

in C #:

Process.Start("Explorer.exe", "-p")
57
// suppose that we have a test.txt at E:\
string filePath = @"E:\test.txt";
if (!File.Exists(filePath))
{
    return;
}

// combine the arguments together
// it doesn't matter if there is a space after ','
string argument = "/select, \"" + filePath +"\"";

System.Diagnostics.Process.Start("Explorer.exe", argument);
294
Samuel Yang

Nur meine 2 Cent wert, wenn Ihr Dateiname Leerzeichen enthält, dh "c:\My File Contains Spaces.txt", müssen Sie den Dateinamen in Anführungszeichen setzen, andernfalls geht der Explorer davon aus, dass die anderen Wörter unterschiedliche Argumente sind ...

string argument = "/select, \"" + filePath +"\"";
31
Adrian Hum

Wenn Ihr Pfad Kommas enthält, können Sie den Pfad mit Anführungszeichen versehen, wenn Sie Process.Start (ProcessStartInfo) verwenden.

Es wird jedoch NICHT funktionieren, wenn Process.Start (string, string) verwendet wird. Es scheint, als ob Process.Start (String, String) die Anführungszeichen in Ihren Argumenten tatsächlich entfernt.

Hier ist ein einfaches Beispiel, das für mich funktioniert.

string p = @"C:\tmp\this path contains spaces, and,commas\target.txt";
string args = string.Format("/e, /select, \"{0}\"", p);

ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "Explorer";
info.Arguments = args;
Process.Start(info);
31
Jan Croonen

Samuel Yang antwortete mir, hier sind meine 3 Cent wert.

Adrian Hum hat recht. Stellen Sie sicher, dass Sie Ihren Dateinamen in Anführungszeichen setzen. Nicht, weil es keine Leerzeichen verarbeiten kann, wie zourtney betont, sondern weil es die Kommas (und möglicherweise andere Zeichen) in Dateinamen als separate Argumente erkennt. Also sollte es so aussehen, wie es Adrian Hum vorgeschlagen hatte.

string argument = "/select, \"" + filePath +"\"";
18

Verwenden Sie "/select,c:\file.txt"

Beachten Sie, dass nach/select ein Komma anstelle eines Leerzeichens stehen sollte.

13
Jigar Mehta

Mit Process.Start auf Explorer.exe mit dem /select Argument funktioniert seltsamerweise nur für Pfade, die kürzer als 120 Zeichen sind.

Ich musste eine native Windows-Methode verwenden, um es in allen Fällen zum Laufen zu bringen:

[DllImport("Shell32.dll", SetLastError = true)]
public static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags);

[DllImport("Shell32.dll", SetLastError = true)]
public static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut);

public static void OpenFolderAndSelectItem(string folderPath, string file)
{
    IntPtr nativeFolder;
    uint psfgaoOut;
    SHParseDisplayName(folderPath, IntPtr.Zero, out nativeFolder, 0, out psfgaoOut);

    if (nativeFolder == IntPtr.Zero)
    {
        // Log error, can't find folder
        return;
    }

    IntPtr nativeFile;
    SHParseDisplayName(Path.Combine(folderPath, file), IntPtr.Zero, out nativeFile, 0, out psfgaoOut);

    IntPtr[] fileArray;
    if (nativeFile == IntPtr.Zero)
    {
        // Open the folder without the file selected if we can't find the file
        fileArray = new IntPtr[0];
    }
    else
    {
        fileArray = new IntPtr[] { nativeFile };
    }

    SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0);

    Marshal.FreeCoTaskMem(nativeFolder);
    if (nativeFile != IntPtr.Zero)
    {
        Marshal.FreeCoTaskMem(nativeFile);
    }
}
11
RandomEngy

Sie müssen die zu übergebenden Argumente ("/ select etc") in den zweiten Parameter der Start-Methode eingeben.

5
Paul
string windir = Environment.GetEnvironmentVariable("windir");
if (string.IsNullOrEmpty(windir.Trim())) {
    windir = "C:\\Windows\\";
}
if (!windir.EndsWith("\\")) {
    windir += "\\";
}    

FileInfo fileToLocate = null;
fileToLocate = new FileInfo("C:\\Temp\\myfile.txt");

ProcessStartInfo pi = new ProcessStartInfo(windir + "Explorer.exe");
pi.Arguments = "/select, \"" + fileToLocate.FullName + "\"";
pi.WindowStyle = ProcessWindowStyle.Normal;
pi.WorkingDirectory = windir;

//Start Process
Process.Start(pi)
5
Corey

Der wahrscheinlichste Grund dafür, dass die Datei nicht gefunden wird, ist der Pfad mit Leerzeichen. Beispielsweise wird "Explorer/select, c:\space space\space.txt" nicht gefunden.

Fügen Sie einfach doppelte Anführungszeichen vor und nach dem Pfad ein, wie z.

Explorer /select,"c:\space space\space.txt"

oder mache das selbe in C # mit

System.Diagnostics.Process.Start("Explorer.exe","/select,\"c:\space space\space.txt\"");
3
Zztri

Es mag ein bisschen übertrieben sein, aber ich mag Convenience-Funktionen. Nehmen Sie also diese:

    public static void ShowFileInExplorer(FileInfo file) {
        StartProcess("Explorer.exe", null, "/select, "+file.FullName.Quote());
    }
    public static Process StartProcess(FileInfo file, params string[] args) => StartProcess(file.FullName, file.DirectoryName, args);
    public static Process StartProcess(string file, string workDir = null, params string[] args) {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.FileName = file;
        proc.Arguments = string.Join(" ", args);
        Logger.Debug(proc.FileName, proc.Arguments); // Replace with your logging function
        if (workDir != null) {
            proc.WorkingDirectory = workDir;
            Logger.Debug("WorkingDirectory:", proc.WorkingDirectory); // Replace with your logging function
        }
        return Process.Start(proc);
    }

Dies ist die Erweiterungsfunktion, die ich als <string> .Quote () verwende:

static class Extensions
{
    public static string Quote(this string text)
    {
        return SurroundWith(text, "\"");
    }
    public static string SurroundWith(this string text, string surrounds)
    {
        return surrounds + text + surrounds;
    }
}
0
Bluescream