Открытие папки в проводнике и выбор файла

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

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

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

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

Ответ 1

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

Process.Start(String, String)

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

Например:

в CMD:

explorer.exe -p

в С#:

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

Ответ на вопрос Сэмюэля Янга помог мне подняться, вот мои 3 цента.

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

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

Ответ 6

Используйте "/select.c:\file.txt"

Обратите внимание, что вместо пробела должна быть запятая после/select.

Ответ 7

Вам нужно передать аргументы ( "/select etc" ) во второй параметр метода Start.

Ответ 8

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)

Ответ 9

Использование Process.Start on 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);
    }
}

Ответ 10

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

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

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

или сделать то же самое в С# с помощью

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