web-dev-qa-db-ja.com

エクスプローラーでフォルダーを開き、ファイルを選択する

ファイルを選択した状態でエクスプローラーでフォルダーを開こうとしています。

次のコードは、ファイルが見つからないという例外を生成します。

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

このコマンドをC#で実行するにはどうすればよいですか?

136
Michael L

このメソッド を使用します:

Process.Start(String, String)

最初の引数はアプリケーション(Explorer.exe)で、2番目のメソッド引数は実行するアプリケーションの引数です。

例えば:

cMD:

Explorer.exe -p

c#の場合:

Process.Start("Explorer.exe", "-p")
57
// 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);
294
Samuel Yang

ちょうど2セントの価値があります。ファイル名にスペースが含まれている場合、つまり「c:\ My File Contains Spaces.txt」の場合、ファイル名を引用符で囲む必要があります。

string argument = "/select, \"" + filePath +"\"";
31
Adrian Hum

パスにカンマが含まれている場合、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);
31
Jan Croonen

サミュエル・ヤンの答えは私をつまずかせました、ここに私の3セントの価値があります。

エイドリアン・ハムは正しいです。ファイル名を引用符で囲んでください。 zourtneyが指摘したようにスペースを処理できないからではなく、ファイル名のコンマ(およびその他の文字)を個別の引数として認識するためです。したがって、Adrian Humが示唆したように見えるはずです。

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

「/select,c:\file.txt」を使用します

/ selectの後にスペースではなくカンマが必要であることに注意してください。

13
Jigar Mehta

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

Startメソッドの2番目のパラメーターに渡す引数( "/ select etc")を配置する必要があります。

5
Paul
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)
5
Corey

ファイルが見つからない最も可能性のある理由は、スペースが含まれるパスです。たとえば、「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\"");
3
Zztri

それはちょっとやり過ぎかもしれませんが、私は便利な機能が好きなので、これを取ります:

    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;
    }
}
0
Bluescream