在资源管理器中打开一个文件夹并选择一个文件

我试图打开资源管理器中的文件夹与文件选定。

下面的代码生成一个未找到异常的文件:

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

如何在 C # 中执行这个命令?

161967 次浏览

您需要将要传递的参数(“/select etc”)放在 Start 方法的第二个参数中。

使用 这种方法:

Process.Start(String, String)

第一个参数是应用程序(glober.exe) ,第二个方法参数是您运行的应用程序的参数。

例如:

在 CMD:

explorer.exe -p

C # :

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

使用“/select,c: file.txt”

注意,在/select 之后应该有一个逗号,而不是空格. 。

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

如果你的文件名包含空格,比如“ c: My File ContainesSpaces.txt”,你需要在文件名周围加上引号,否则 Explorer 会认为其他的单词是不同的参数..。

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

杨的回答绊倒了我,这里是我的3美分的价值。

Adrian Hum 是对的,确保在你的文件名前面加上引号。不是因为它不能像 zourtney 指出的那样处理空格,而是因为它将文件名中的逗号(可能还有其他字符)识别为单独的参数。 所以应该像 Adrian Hum 建议的那样。

string argument = "/select, \"" + filePath +"\"";
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)

如果您的路径包含逗号,那么在使用 Process.Start (ProcessStartInfo)时,在路径周围加引号将会起作用。

当使用 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);

奇怪的是,在 explorer.exe上使用带 /select参数的 Process.Start只适用于长度小于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);
}
}

它找不到文件的最可能的原因是路径中有空格。例如,它不会找到“ 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\"");

这可能有点过分,但我喜欢方便的功能,所以采取这一点:

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

这是我用作 & # x3C; string & # x3E; . 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;
}
}

基于 Jan Croonen 的回答的简单 C # 9.0方法:

private static void SelectFileInExplorer(string filePath)
{
Process.Start(new ProcessStartInfo()
{
FileName = "explorer.exe",
Arguments = @$"/select, ""{filePath}"""
});
}