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



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



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



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


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

529   10  

10 ответов:

использовать этот метод:

Process.Start(String, String)

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

например:

в CMD:

explorer.exe -p

В C#:

Process.Start("explorer.exe", "-p")
// 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);

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

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

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

Он не будет работать при использовании процесса.Начало (строка, строка) однако. Это похоже на процесс.Start (string, string) фактически удаляет кавычки внутри ваших args.

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

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

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

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

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

использовать "/ "выбор", c:\file.txt"

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

используя 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);
    }
}

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

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)

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

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

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

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

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

Comments

    Ничего не найдено.