Membuka folder di explorer dan memilih file


150

Saya mencoba membuka folder di explorer dengan file yang dipilih.

Kode berikut menghasilkan file tidak ditemukan pengecualian:

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

Bagaimana saya bisa mendapatkan perintah ini untuk dieksekusi di C #?

Jawaban:


51

Gunakan metode ini :

Process.Start(String, String)

Argumen pertama adalah aplikasi (explorer.exe), argumen metode kedua adalah argumen dari aplikasi yang Anda jalankan.

Sebagai contoh:

dalam CMD:

explorer.exe -p

dalam C #:

Process.Start("explorer.exe", "-p")

32
ini tidak memilih file seperti jawaban Samuel Yangs
henon

-p tidak cukup untuk memilih file
Jek

327
// 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);

1
itu penting bagi saya :) itu tidak hanya membuka direktori tetapi memilih file tertentu juga :) terima kasih salam
InfantPro'Aravind '28

2
Ini bekerja seperti pesona tetapi setiap Ide bagaimana kita bisa melakukan itu untuk banyak file?
Pankaj

7
Catatan kecil, argumen / select dengan path file sepertinya tidak berfungsi untuk saya jika path file saya menggunakan garis miring. Karena itu saya harus melakukan filePath = filePath.Replace ('/', '\\');
Victor Chelaru

6
Seperti disebutkan di tempat lain, jalur Anda harus berisi tanda kutip - ini mencegah masalah dengan direktori atau nama file yang mengandung koma.
Kaganar

4
Saya berjuang pada masalah ini kadang-kadang pendekatan di atas tidak berhasil karena file tersebut mengandung koma. Jika saya membaca komentar Kaganar, itu akan menyelamatkan saya satu jam kerja. Saya mendesak Samuel Yang untuk mengubah kode di atas ke: argumen string = @ "/ pilih" + "\" "+ filePath +" \ ""
Wayne Lo

34

Jika jalur Anda berisi koma, menempatkan tanda kutip di sekitar jalur akan berfungsi saat menggunakan Process.Start (ProcessStartInfo).

Namun TIDAK akan berfungsi saat menggunakan Process.Start (string, string). Sepertinya Process.Start (string, string) benar-benar menghilangkan tanda kutip di dalam argumen Anda.

Ini adalah contoh sederhana yang cocok untuk saya.

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

Ini harus menjadi jawaban yang diterima. Itu hanya tidak memiliki pengecualian penanganan yang tepat untuk berbagai kemungkinan kegagalan (masalah hak, jalan yang salah, dll)
AFract

Ini adalah jawaban yang benar, jawaban yang diterima tidak bekerja, jawaban Yang juga tidak berhasil.
VK

31

Nilai saya hanya 2 sen, jika nama file Anda mengandung spasi, yaitu "c: \ My File Contains Spaces.txt", Anda harus mengelilingi nama file dengan tanda kutip, jika tidak, penjelajah akan menganggap bahwa kata-kata lain adalah argumen yang berbeda ...

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

4
Sebenarnya, tidak, kamu tidak. Contoh @Samuel Yang bekerja dengan path dengan spasi (diuji Win7)
Courtney Christensen

8
Baca jawaban oleh Phil Hustwick di bawah ini tentang mengapa Anda harus mengutipnya
Akku

18

Jawaban Samuel Yang membuat saya tersandung, ini adalah 3 sen saya.

Adrian Hum benar, pastikan Anda memberi tanda kutip di sekitar nama file Anda. Bukan karena ia tidak dapat menangani spasi seperti yang ditunjukkan zourtney, tetapi karena itu akan mengenali koma (dan mungkin karakter lain) dalam nama file sebagai argumen terpisah. Jadi seharusnya terlihat seperti saran Adrian Hum.

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

1
Dan pastikan untuk memastikan itu filePathtidak mengandung "di dalamnya. Karakter ini tampaknya ilegal pada sistem Windows tetapi diizinkan pada semua yang lain (misalnya, sistem POSIXish), sehingga Anda memerlukan lebih banyak kode jika Anda menginginkan portabilitas.
binki

14

Menggunakan Process.Startpada explorer.exedengan /selectargumen anehnya hanya bekerja untuk jalur kurang dari 120 karakter.

Saya harus menggunakan metode windows asli untuk membuatnya berfungsi dalam semua kasus:

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

Ini membantu saya menggunakan kembali satu folder. Process.Start ("explorer.exe", "/ pilih xxx") membuka folder baru setiap kali!
Mitkins

ini adalah bagaimana hal itu harus dilakukan, saya juga akan membuat bendera untuk sfgao, dan meneruskan enum itu alih-alih uint
L.Trabacchin

Ini bekerja meskipun dengan masalah kecil; pertama kali folder dibuka itu tidak disorot. Saya menyebutnya di dalam metode klik tombol, dan begitu folder terbuka jika saya mengklik tombol lagi, maka itu menyoroti file / folder yang dipilih. Apa yang bisa menjadi masalah?
Sach

13

Gunakan "/select,c:\file.txt"

Perhatikan harus ada koma setelah / pilih bukan spasi ..


6

Anda perlu menempatkan argumen untuk lulus ("/ pilih dll") di parameter kedua metode Mulai.


5
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

Alasan yang paling memungkinkan untuk tidak menemukan file adalah path yang memiliki spasi. Sebagai contoh, itu tidak akan menemukan "explorer / pilih, c: \ space space \ space.txt".

Tambahkan saja tanda kutip ganda sebelum dan sesudah jalur, seperti;

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

atau lakukan hal yang sama dalam C # dengan

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

1

Mungkin sedikit berlebihan tapi saya suka fungsi kenyamanan jadi ambillah yang ini:

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

Ini adalah fungsi ekstensi yang saya gunakan sebagai <string> .Quote ():

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;
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.