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


150

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

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

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

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

回答:


51

この方法を使用します

Process.Start(String, String)

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

例えば:

CMD:

explorer.exe -p

C#の場合:

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

32
これは、Samuel Yangsの回答のようにファイルを選択しません
henon

-pではファイルを選択するのに十分ではありません
Jek

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

1
それは私にとって重要でした:)ディレクトリを開いただけでなく、特定のファイルも選択しました:)よろしく
お願いし

2
それは魅力のように機能しますが、どのようなアイデアでも複数のファイルに対してどのように実行できますか?
Pankaj

7
ちなみに、ファイルパスで/ select引数を使用しても、ファイルパスでスラッシュが使用されていると機能しないようです。したがって、filePath = filePath.Replace( '/'、 '\\');を実行する必要があります。
ビクターチェラル2013年

6
他の場所で述べたように、パスは引用符で囲む必要があります。これにより、コンマを含むディレクトリまたはファイル名の問題が回避されます。
Kaganar 2013

4
ファイルにコンマが含まれているため、上記のアプローチが機能しないことがあるという問題を抱えていました。Kaganarのコメントを読んだとしたら、1時間の作業が節約できただろう。上記のコードを次のように変更するようにサミュエルヤンにお願いします:string argument = @ "/ select" + "\" "+ filePath +" \ ""
Wayne Lo

34

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

これは受け入れられる答えになるはずです。さまざまな失敗(権利の問題、間違ったパスなど)に対する適切な例外処理が欠けている
AFract

これは正しい答えです。受け入れられた答えは機能しません。Yangの答えも機能しません。
VK

31

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

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

4
実際には、そうではありません。@Samuel Yangの例は、スペースを含むパスで動作します(Win7でテスト済み)
コートニークリステンセン、

8
それでも引用符を付ける必要がある理由については、下記のPhil Hustwickの回答を読んでください
Akku

18

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

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

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

1
そして、それfilePathが含ま"れていないことを確認してください。この文字はWindowsシステムでは明らかに違法ですが、他のすべてのシステム(POSIXishシステムなど)では許可されているため、移植性が必要な場合はさらに多くのコードが必要です。
binki 2018年

14

引数とともにProcess.Starton 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);
    }
}

これにより、1つのフォルダを再利用できました。Process.Start( "explorer.exe"、 "/ select xxx")は毎回新しいフォルダを開きます!
ミトキンス2016年

これがどのように行われるべきか、私はsfgaoのフラグも作成し、uintの代わりにその列挙を渡します
L.Trabacchin

これは小さな問題で動作します。フォルダを初めて開いたときは、強調表示されていません。これをボタンクリックメソッド内で呼び出し、フォルダーが開いたら、もう一度ボタンをクリックすると、選択したファイル/フォルダーが強調表示されます。何が問題でしょうか?
サックス

13

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

スペースの代わりに/ selectの後にコンマがあるはずです。


6

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


5
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

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

1

少々やり過ぎかもしれませんが、私は便利な機能が好きなので、これを取り上げます。

    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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.