2011-01-18 2 views
11

「ファイルを開く」ダイアログを開く簡単な方法はありますか?「ファイルを開く」ダイアログを表示するにはどうすればよいですか?

+4

Winforms? WPF? Webフォーム? MVC? – Oded

+0

CodeProjectには、Googleを検索するときにトップになる記事があります。http://www.codeproject.com/KB/shell/openwith.aspxしかし、私はexterns( "ProcessStartInfo'、おそらく?)に頼るよりむしろ、これをやっているよりきれいな方法を見たいと思います。 –

+2

http://stackoverflow.com/a/32153874/5306861 – codeDom

答えて

9

これはトリックを行うべき...

var processInfo = new ProcessStartInfo(fileName); 
processInfo.Verb = "openas"; 
Process.Start(processInfo); 

オデッドは大きなポイントになります、が、 - あなたは、このような機能を使用する正確にどのように/どこ知ることは、これはあなたの状況のた​​めの答えではないかもしれません意味しません。

この回答に対する最近のコメントは、私が最初にあまり詳しく説明していなかったことを示しています。 に、すでにそのタイプのファイルに対して定義された動詞がopenであるファイルを試すと、問題が発生します。同様に、openにその動詞が定義されていないファイルを試そうとすると、問題が発生します。問題は次のようになります。

Win32Exception:いいえアプリケーションが私はこの種のコードを使用するためにことをトマスに提案し、この操作のために指定されたファイル

私の頭の上オフに関連付けられていませんプロダクションアプリケーションを徹底的にチェックし、おそらくレジストリをチェックするか、またはファイルを任意の動詞で開くことができるかどうかを調べる必要があります。 ProcessStartInfo.Verbsを考えてみると、それよりも簡単です:fileNameが設定されたら、ファイルタイプに関連する可能性のある動詞の集合を提供します。これにより、どのファイルをどのように処理するかを簡単に判断できるようになります。

私がトーマスに言及したように、アプリケーションにいくつかの複雑さやインテリジェンスを追加する必要があります。この答えは確かにすべての解決策ではありません。

+1

動作しません... Win32Exceptionは、 "この操作に指定されたファイルにアプリケーションが関連付けられていません" –

+0

@ThomasLevesqueこれは、 'default programs'定義されている。つまり、「Open with ...」があれば'コンテキストメニューでは、これは失敗します。単純に 'Open'オプションを指定した不明なファイルタイプの場合、これは機能します。逆もまた当てはまります:既知のファイルタイプに 'open'動詞を使うとデフォルトプログラムが起動しますが、未知の場合には同じ例外が発生します。したがって、適切なアプリケーションでは、これについて徹底したいと思っています。おそらく既知のファイルタイプのリポジトリ(レジストリ)で検索し、システムによって与えられた事実をどのように開くかの決定に基づいています。 –

+0

@ThomasLevesque実際、あなたはそのような長さに行く必要はありません:['ProcessStartInfo.Verbs'](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.verbs( VS.90).aspx)は、 'fileName'が設定されているときにファイルの可能な動詞で設定されます。つまり、' open'動詞が定義されているかどうか、 'openas'を使用していないかどうかだけを調べることができます。これは私が賭けたすべてのケースを捕らえるわけではないので、あなた自身の賢さを自由に追加してください。 –

-3

にはshell examplesのトンがあります。たぶんあなたはそれらを見て、ある例が持つべき機能を持っているかどうかを知ることができます。デフォルトのプログラムは、ダイアログを開いているが定義されていない場合、ファイルは、デフォルトのプログラムでopenenedされます

System.Diagnostics.Process.Start(path); 

を使用して

18

がProcExpといくつかのリバースエンジニアリングが働いていたします。rundll32.exeコマンドラインを明らかにした:あなたは上でこの機能を使用する例があり

[DllImport("shell32.dll", SetLastError = true)] 
extern public static bool 
     ShellExecuteEx(ref ShellExecuteInfo lpExecInfo); 

あなたが機能を使用することができます。

using System; 
using System.Diagnostics; 
using System.IO; 

class Program { 
    static void Main(string[] args) { 
     ShowOpenWithDialog(@"c:\temp\test.txt"); 
    } 
    public static void ShowOpenWithDialog(string path) { 
     var args = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "shell32.dll"); 
     args += ",OpenAs_RunDLL " + path; 
     Process.Start("rundll32.exe", args); 
    } 
} 

Win7でテストしたところ、他のバージョンのWindowsではどれくらいうまく動作するかわかりません。

+0

ありがとう@ハンス!私はしばらくブッシュの周りにぶつかっていた、これは私が必要なものです。私はshell32.dllの完全なパスを使用していませんでした。 – tehDorf

+0

OpenAs_RunDLLは文書化されておらず、[常に動作するとは限りません。](http://stackoverflow.com/questions/23566667/rundll32-shell32-dl​​l) –

関連する問題