ファイルを選択した状態でエクスプローラーでフォルダーを開こうとしています。
次のコードは、ファイルが見つからないという例外を生成します。
System.Diagnostics.Process.Start(
"Explorer.exe /select,"
+ listView1.SelectedItems[0].SubItems[1].Text + "\\"
+ listView1.SelectedItems[0].Text);
このコマンドをC#で実行するにはどうすればよいですか?
このメソッド を使用します:
Process.Start(String, String)
最初の引数はアプリケーション(Explorer.exe)で、2番目のメソッド引数は実行するアプリケーションの引数です。
例えば:
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 File Contains Spaces.txt」の場合、ファイル名を引用符で囲む必要があります。
string argument = "/select, \"" + filePath +"\"";
パスにカンマが含まれている場合、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);
サミュエル・ヤンの答えは私をつまずかせました、ここに私の3セントの価値があります。
エイドリアン・ハムは正しいです。ファイル名を引用符で囲んでください。 zourtneyが指摘したようにスペースを処理できないからではなく、ファイル名のコンマ(およびその他の文字)を個別の引数として認識するためです。したがって、Adrian Humが示唆したように見えるはずです。
string argument = "/select, \"" + filePath +"\"";
「/select,c:\file.txt」を使用します
/ selectの後にスペースではなくカンマが必要であることに注意してください。
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);
}
}
Startメソッドの2番目のパラメーターに渡す引数( "/ select etc")を配置する必要があります。
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\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);
}
これは、<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;
}
}