Process.Startを使用してフォルダーを開く


148

私は他のトピックを見ました、そして私は別の問題を抱えています。プロセスは開始されていますが(タスクマネージャで表示されます)、画面上でフォルダが開いていません。どうしましたか?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

あなたの道は正しいですか?
Nathan Koop、

1
なぜExplorerを手動で呼び出したいのですか?なぜフォルダを開くだけではなく、つまり、UseShellExecuteをtrueに設定し、Verbを「open」に設定して、ProcessStartInfoを呼び出しますか?
OregonGhost 2009

1
はい、パスなしで「explorer.exe」を開こうとしましたが、どちらも機能しませんでした。
ダニエル

質問はフォルダーを開く方法ではなく、explorer.exeを実行してフォルダーを開く方法なので、投稿しませんでした。理由があるかもしれないので、なぜエクスプローラを直接最初に起動するのかを知りたかっただけです;)
OregonGhost

ここでオプションを除外したいだけなので、これは愚かな質問かもしれません。モノを使用してLinuxでこれを行っているのではないでしょう。私たちはWindows環境について話していますか?
FredrikMörk、

回答:


266

フォルダ「c:\teste」が存在することを確認しましたか?そうでない場合、エクスプローラーが開き、デフォルトのフォルダー(私の場合は " C:\Users\[user name]\Documents")が表示されます。

更新

私は以下のバリエーションを試しました:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

これらのどれも(例外をスローするものを除いて)コンピューターで動作しない場合、問題はコードではなく環境にあるとは思われません。その場合は、次のいずれか(または両方)を試してみます。

  • 実行ダイアログを開き、「explorer.exe」と入力してEnterキーを押します
  • コマンドプロンプトを開き、「explorer.exe」と入力してEnterキーを押します

まあ、それが存在しなかった場合、同じ方法でフォルダを開くかどうかは確かです。
ダニエル

さて、それは環境問題かもしれません.. cmdを介してexplorer.exeを開き、通常の..を開きました。例外を投げた
ダニエル

1
エクスプローラウィンドウが既に開いている場合の小さな違い:Process.Start(path) ウィンドウをアクティブにします(タスクバーでのみ点滅し、前面に表示されない場合があります)。explorer.exe+ parameterは新しいウィンドウを常に前面に開きます(ただし、同じウィンドウの複数回)。したがって、どちらにも警告があります。
KekuSemau 16

Process.Start(@"c:\temp")注意して使用する必要があります。c:\temp.com存在する場合は、c:\temp.com代わりに関数呼び出しが開きます。詳細については、forums.iis.net / p / 1239773 / 2144186.aspxを参照してください。
Lex Li

Process.Start(@"c:\temp")などの別のフォルダを開く可能性があることに注意してください。VS自体がバグのある動作を示すこの問題を参照してください。これを回避するには、バリアントを使用するか、(より良いIMO)常にを追加します。たとえば、。C:\temp.exeC:\temp.cmdexplorer.exePath.DirectorySeparatorCharProcess.Start(@"C:\temp\")
binki 2018年

46

完全を期すために、フォルダを開くだけの場合は、次のようにします。

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

FileNameの末尾がであることを確認Path.DirectorySeparatorCharして、フォルダーを明確に指すようにします。(@binkiに感謝します。)

このソリューションは、フォルダーを開いて項目を選択する場合は機能しません。動詞がないためです。


これは、WindowsとMonoを使用するLinuxの両方で機能します。
Menno Deij-van Rijswijk

1
この方法を使用し、C:\teste.exeまたはなどのフォルダーC:\teste.cmdが存在する場合、エクスプローラーは、意図したフォルダーではなく、他のフォルダーを開きます。これを回避するPath.DirectorySeparatorCharには、パスにを追加します。VS自体がどのようにして同じ間違いをするかをご覧ください。
binki 2018年

「/ select」を使用した@Scyssionの回答を考えると、は使用できると思いますが、残念ながら使用Verb = "select"できません。とにかく、素晴らしい答え!
idbrii

1
これは、上記の受け入れられた回答とは異なり、.NET Core 3では私にとっては機能します。設定Verb = "open"は必要ありませんでした。(Windowsでテスト済み、他のOSは異なる場合があります。)
Walt D

docs.microsoft.com/en-us/dotnet/api/…)の.Verbsプロパティから適切な動詞を取得できますProcessStartInfo
GaryNg

16

ファイルまたはフォルダーを選択する場合は、以下を使用できます。

Process.Start("explorer.exe", "/select, c:\\teste");

2
フォルダーを選択するのではなく開くには、次のように変更/selectします/open
SushiGuy

5

@記号を使用しているため、バックスラッシュをエスケープする必要がありません。

@を削除するか、\\を\に置き換えます


それでもフォルダを開かない..タスクマネージャ@プロセスを開始するだけ
Daniel

これ以上の提案はありません
。VisualC

1
そうだね…シマウマ。探索者に何か問題があります。おそらくviriiか何か…
R. Martinho Fernandes

4

エスケープされていない文字列を使用する場合、二重のバックスラッシュは必要ありません。

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

System.Diagnostics.Process.Start()オーバーロードの1つを使用する必要があります。とても簡単です!

実行するプロセスのファイル名を指定しない場合(explorer.exe)、システムはそれを有効なフォルダーパスとして認識し、すでに実行中のエクスプローラープロセスに添付しようとします。この場合、フォルダがすでに開いていると、エクスプローラは何もしません。

プロセスのファイル名を(そうしたように)配置すると、システムはプロセスの新しいインスタンスを実行しようとし、2番目の文字列をパラメーターとして渡します。文字列が有効なフォルダである場合、新しく作成されたプロセスで開かれます。そうでない場合、新しいプロセスは何もしません。

どのような場合でも、プロセスによって無効なフォルダーパスがどのように処理されるのかわかりません。System.IO.Directory.Exists()それを確実にするには使用するだけで十分です。


を追加する必要があることを忘れないでくださいPath.DirectorySeparatorChar。それ以外の場合、同じ名前.cmdまたは.exe他のサフィックスを持つフォルダが存在する場合、エクスプローラはその別のフォルダを開きます。または、それらが実際に実行可能ファイルまたはスクリプトである場合は、意図したとおりにフォルダを開くのではなく、それらを実行します。
binki 2018年

1

ProcessStartInfoインスタンスを受け取るオーバーロードされたバージョンのメソッドを使用し、ProcessWindowStyleプロパティを適切な値に設定します。



1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

このコードはVS2010環境で正常に機能し、ローカルフォルダーを適切に開きますが、IISで同じアプリケーションをホストして開こうとすると、確実に失敗します。


1

Iveにこの問題が発生しました。その理由を知りました。私の理由はここにリストされていないので、この問題を受け取った誰もがこれらの問題を修正しません。

別のユーザーとしてVisual Studioを実行し、Process.Startを使用しようとすると、そのユーザーコンテキストで実行され、画面に表示されません。


0

奇妙な。

explorer.exeが見つからない場合は、例外が発生するはずです。フォルダーが見つからない場合でも、いくつかのフォルダー(たとえば、マイドキュメント)を開く必要があります。

Explorerの別のコピーがタスクマネージャーに表示されたが、表示されない。

オフスクリーン(つまり、別のモニター)を開いている可能性はありますか?

それとも、非インタラクティブなサービスでこれを行うのですか?


モニターが1台しかなく、「エクスプローラーの別のコピーがタスクマネージャーに表示されるが、表示されない」と言いました。これは正しい..どういう意味かわかりませんが、「非インタラクティブサービスでこれを実行しているのですか」
ダニエル

あなたが書いているプログラムが、通常のwinformsプログラムとは対照的に、サービス(デフォルトでは完全にバックグラウンドで実行される)である場合を意味しました。(サービスが何かわからない場合は、サービスを作成している可能性は低いです)。タスクマネージャーに戻って、この非表示のエクスプローラーウィンドウで「切り替え」、「最前面へ」、または「最大化」のいずれかを選択すると、表示されますか?
sgmoore 2009

0

スタートメニューから「explorer.exe c:\ teste」を実行すると、正しく開きますか?あなたはこれをどのくらいの間やっていますか?マシンに多くのプロセスがあり、新しいプロセスを開いたときにも同様の動作が見られます(セットはIEと表示されます)。タスクマネージャーで起動しますが、フロントエンドには表示されません。再起動を試みましたか?

次のコードは新しいエクスプローラインスタンスを開くはずです

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

これを試すときに、たくさんのアプリケーションが実行されていますか?非常に多くのウィンドウを開いていると、システムのGDIハンドルが不足するため、仕事で奇妙な動作が発生することがあります(アプリはたくさん使用します)。

これが発生すると、何かを閉じてGDIハンドルを解放するまで、ウィンドウとコンテキストメニューは表示されなくなります。

XPとVistaのデフォルトの制限は10000です。私のDevStudioが1500のGDIハンドルを持っていることは珍しいことではないため、Dev Studioのコピーをいくつか開いていると、すぐにそれらを使い果たす可能性があります。TaskManagerに列を追加して、各プロセスで使用されているハンドルの数を確認できます。

制限を増やすためにできるレジストリの微調整があります。

詳細については、http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspxを参照してください


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