Открытие папки в проводнике и выбор файла - PullRequest
133 голосов
/ 02 декабря 2008

Я пытаюсь открыть папку в проводнике с выбранным файлом.

Следующий код создает исключение для файла, не найденного:

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

Как мне заставить эту команду выполняться в C #?

Ответы [ 11 ]

287 голосов
/ 30 марта 2009
// 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);
59 голосов
/ 02 декабря 2008

Используйте этот метод :

Process.Start(String, String)

Первый аргумент - это приложение (explorer.exe), второй аргумент метода - это аргументы приложения, которое вы запускаете.

Например:

в CMD:

explorer.exe -p

в C #:

Process.Start("explorer.exe", "-p")
31 голосов
/ 28 марта 2012

Если ваш путь содержит запятые, кавычки вокруг пути будут работать при использовании Process.Start (ProcessStartInfo).

Однако он НЕ будет работать при использовании Process.Start (строка, строка). Кажется, что Process.Start (строка, строка) на самом деле удаляет кавычки внутри ваших аргументов.

Вот простой пример, который работает для меня.

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 голосов
/ 04 октября 2010

Только мои 2 цента, если ваше имя файла содержит пробелы, т.е. "c: \ My File Contains Spaces.txt", вам нужно будет заключить имя файла в кавычки, иначе проводник будет считать, что другие слова - это разные аргументы. ..

string argument = "/select, \"" + filePath +"\"";
18 голосов
/ 30 января 2012

Ответ Самуэля Яна сбил меня с толку, вот мои 3 цента.

Адриан Хам прав, убедитесь, что вы ставите кавычки вокруг вашего имени файла. Не потому, что он не может обрабатывать пробелы, как указал Зортни, а потому, что он распознает запятые (и, возможно, другие символы) в именах файлов как отдельные аргументы. Так должно выглядеть, как предположил Адриан Хам.

string argument = "/select, \"" + filePath +"\"";
13 голосов
/ 13 февраля 2009

Использование "/select,c:\file.txt"

Обратите внимание, что после / выберите вместо пробела запятую.

11 голосов
/ 10 сентября 2016

Использование Process.Start в explorer.exe с аргументом /select странным образом работает только для путей длиной менее 120 символов.

Мне пришлось использовать собственный метод Windows, чтобы он работал во всех случаях:

[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);
    }
}
5 голосов
/ 05 марта 2012
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 голосов
/ 02 декабря 2008

Вам необходимо поместить передаваемые аргументы ("/ select и т. Д.") Во второй параметр метода Start.

3 голосов
/ 08 ноября 2017

Наиболее вероятная причина, по которой он не может найти файл - это путь с пробелами. Например, он не найдет "explorer / select, c: \ space space \ space.txt".

Просто добавьте двойные кавычки до и после пути, как;

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

или сделать то же самое в C # с

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