NonSoft

拡張子に関連づいたEXEのPATHを取得する
サンプル(C#.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
拡張子に関連づいたEXE(アプリケーション)のPATHを取得するサンプル(C#.NET)です。

拡張子に関連づいたAPのPATHを取得するためにはレジストリから情報を取得する必要があります。
関連付けの情報はシステムが持っている情報とエクスプローラが持っている情報があります。
通常は、エクスプローラが持っている関連付けの情報でファイルを開きたいと思いますので、
このサンプルでも、まずエクスプローラが持っている関連付けの情報を検索し、見つからない時に
システムが持っている関連付けの情報を検索します。

システムが持っている関連付けの情報ですとテキストエディタはメモ帳です。

VB.NET版はこちらです。
拡張子に関連づいたEXEのPATHを取得するサンプル(VB.NET)

VB6版はこちらです。
拡張子に関連づいたEXEのPATHを取得するサンプル(VB6)

このサンプルは以下のようなフォルダ関係やファイル関係のツールで使用されています。
フォルダ内のファイル比較ツール
テキスト差分表示ツール
フォルダ監視人

★フォームモジュール(Form1.cs)
private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show(GetExtApPath(@"C:\Temp\Text.txt"));
}

/// <summary>
/// 拡張子に関連づいたアプリケーションのPATH取得(引数PATH付き)
/// </summary>
/// <param name="fpath">ファイルPATH(拡張子付き)</param>
/// <returns>コマンドライン</returns>
private String GetExtApPath(String fpath)
{
    String ext = System.IO.Path.GetExtension(fpath);
    if (ext.Substring(0, 1) != ".") ext = "." + ext;

    String strCmd = "";
    String strApp = "";
    Microsoft.Win32.RegistryKey regKey;

    try
    {
        // 拡張子に関連づいたアプリケーションのPATH取得(エクスプローラ編)
        regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(String.Format(
            @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{0}", ext));
        if (regKey != null)
        {
            strApp = (String)(regKey.GetValue("Application"));
            regKey.Close();
        }

        if (strApp == "")
        {
            // アプリケーションが見つけられなかった場合はOpenWithListから探す
            regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(String.Format(
            @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{0}\OpenWithList",
            ext));
            if (regKey != null)
            {
                String mruList = (String)(regKey.GetValue("MRUList"));
                strApp = (String)(regKey.GetValue(mruList.Substring(0, 1)));
                regKey.Close();
            }else{
                // 拡張子に関連づいたアプリケーションのPATH取得(システム編)
                throw new Exception();
            }
        }

        if (strApp != "")
        {
            // アプリケーションのPATH取得
            regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(String.Format(
                @"Applications\{0}\shell\open\command", strApp));
            if (regKey != null)
            {
                strCmd = (String)(regKey.GetValue(""));
                regKey.Close();
            }
            else
            {
                // 拡張子に関連づいたアプリケーションのPATH取得(システム編)
                throw new Exception();
            }
        }
        else
        {
            // 拡張子に関連づいたアプリケーションのPATH取得(システム編)
            throw new Exception();
        }

    }
    catch
    {
        // 拡張子に関連づいたアプリケーションのPATH取得(システム編)
        regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
        if (regKey != null)
        {
            String fileType = (String)(regKey.GetValue(""));
            regKey.Close();

            // アプリケーションのPATH取得
            regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(String.Format(
                @"{0}\shell\open\command", fileType));
            if (regKey != null)
            {
                strCmd = (String)(regKey.GetValue(""));
                regKey.Close();
            }
        }
    }

    // コマンドラインの引数部分に指定のファイルPATHを設定
    strCmd = strCmd.Replace("\"%1\"", "\"" + fpath + "\"");
    strCmd = strCmd.Replace("%1", "\"" + fpath + "\"");
    return strCmd;
}