답변:
// 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);
경로에 쉼표가 포함되어 있으면 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);
파일 이름에 공백이 포함되어 있으면 내 2 센트 만 사용할 수 있습니다 (예 : "c : \ My File Contains Spaces.txt"). 파일 이름을 따옴표로 묶어야합니다. 그렇지 않으면 탐색기에서 othe 단어가 다른 인수라고 가정합니다.
string argument = "/select, \"" + filePath +"\"";
사무엘 양의 대답이 저를 넘어 뜨 렸습니다. 여기에 3 센트의 가치가 있습니다.
Adrian Hum이 옳습니다. 파일 이름을 따옴표로 묶어야합니다. zourtney가 지적한 것처럼 공백을 처리 할 수 없기 때문에 파일 이름의 쉼표 (및 다른 문자)를 별도의 인수로 인식하기 때문입니다. Adrian Hum이 제안한 것처럼 보일 것입니다.
string argument = "/select, \"" + filePath +"\"";
filePath
포함 "
되어 있지 않은지 확인하십시오 . 이 문자는 Windows 시스템에서는 불법이지만 POSIXish 시스템과 같은 다른 모든 시스템에서는 허용되므로 이식성을 원한다면 더 많은 코드가 필요합니다.
인수 와 함께 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,c:\file.txt"를 사용하십시오.
공백 대신 / select 뒤에 쉼표가 있어야합니다.
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)
약간 과잉 일 수 있지만 편의 기능을 좋아하므로 다음 중 하나를 수행하십시오.
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);
}
이것은 <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;
}
}