DOBON.NET DOBON.NETプログラミング掲示板過去ログ

アプリケーションのパスを取得する方法

環境/言語:[.net2003]
分類:[.NET]

C#でProcess.Start("Notepad")でメモ帳が起動できるのは知っていますが、
この要領で"Notepad"と指定すると、そのフルパスを取得する方法ありませんでしょうか?
Process.startの具体的な内部処理はわかりませんが、レジストリか何かを見て
そういうアプリが登録されているのを確認して、実行しているのだと勝手に解釈して、
それならそのファイルのフルパスもわかるのでは?と考えた次第です。
どうかよろしくお願いします。
■No15168に返信(架瑠魯巣さんの記事)
> Process.startの具体的な内部処理はわかりませんが、レジストリか何かを見て
> そういうアプリが登録されているのを確認して、実行しているのだと勝手に解釈して、

違うと思います。

%WinDir% または System32 ディレクトリ直下に存在するかどうかです。
試しに適当なテキスト ファイルを直下において、Process.Start メソッドを実行してみると良いでしょう。

___________________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
> %WinDir% または System32 ディレクトリ直下に存在するかどうかです。
> 試しに適当なテキスト ファイルを直下において、Process.Start メソッドを実行してみると良いでしょう。

なるほど、確かになりました。
肝心の質問内容の
>C#でProcess.Start("Notepad")でメモ帳が起動できるのは知っていますが、
>この要領で"Notepad"と指定すると、そのフルパスを取得する方法ありませんでしょうか?

の方を知りたいのですが・・・
直接、ピンポイントでフルパス取得できる方法を教えてください。
>%WinDir% または System32 ディレクトリ直下に存在するかどうかです。
>
環境変数PATHに指定されているか現在のカレントディレクトリでは?

パスの取得方法↓でどうですか?
http://dobon.net/vb/dotnet/system/findassociatedexe.html
> パスの取得方法↓でどうですか?
> http://dobon.net/vb/dotnet/system/findassociatedexe.html

ちょっと質問がずれてきているような・・・
別に関連付けされてるファイルが欲しいのではないのですが

自分なりに調べた部分で追記します。
Process.start(アプリケーション名)での有効なフォルダですが、
>%WinDir% または System32
の他に、当然ながらカレントディレクトリ、Cドライブ直下も有効でした。

で、本題に戻したいのですがProcess.start("Notepad.exe")みたいに
アプリケーション名を指定するだけで実行できるファイルのフルパス
をプログラム中で取得したいということです。
■No15171に返信(GODさんの記事)
> > %WinDir% または System32 ディレクトリ直下に存在するかどうかです。
> 環境変数PATHに指定されているか現在のカレントディレクトリでは?

System32は問答無用だったと思う。
それともWinDirが登録されているからだったかな。

■No15174に返信(架瑠魯巣さんの記事)
> で、本題に戻したいのですがProcess.start("Notepad.exe")みたいに
> アプリケーション名を指定するだけで実行できるファイルのフルパス
> をプログラム中で取得したいということです。

だったら環境変数とかそのあたり全部をなめればいいんじゃないの?
一応優先順位はあるから順番になめる。

一応関連付け起動の結果でも起動パスはわかるはずなんだけどなーー
> で、本題に戻したいのですがProcess.start("Notepad.exe")みたいに
> アプリケーション名を指定するだけで実行できるファイルのフルパス
> をプログラム中で取得したいということです。

#該当するクラスがあるかはわかりません。

SearchPath API関数でできると思います。
見つかったとして複数あった場合にどうするかという判断も必要でしょう。
2006/02/21(Tue) 18:16:26 編集(投稿者)

>ちょっと質問がずれてきているような・・・

>で、本題に戻したいのですがProcess.start("Notepad.exe")
特にずれてはいないと思います。その関数でできますので。
Process.Startで指定できるのはアプリ名だけでないので、
FindExecutable関数を使う前に、

  ●指定された文字列に拡張子がついていた場合、
   それが環境変数PATHEXTに存在する拡張子であるかどうかを調べてから
   行う
  ●拡張子がない場合そのまま行う
  ●拡張子がその他の場合、エラーとする。

ようにすればよいのでは。

記載されているバグが気になりますが、
XPでスペース区切りのパスになるexeでもちゃんと返ってきました。
必ず返ってくるかはわかりませんが。
notepadはもちろん、
例えばosql(SQLServerのコマンドシェル)等はちゃんとフルパスが
返ってきました。
「c:\Program Files\Microsoft SQL Server\90\Tools\binn\osql.exe」

この関数を使わないなら、はいこーんさんが書いてますが、
拡張子がPATHEXTにあるか確認、
もしくは拡張子がない場合は各拡張子をループでくっつけながら、
カレントディレクトリとPATHにセットされている各ディレクトリを
順にループしてファイルを探せばよいかと。
上への追記ですが
見る対象はPATHだけじゃなく、ほかの環境変数も必要っぽいです。
SystemDriveとか、いくつか。
>SearchPath API関数でできると思います。
このAPIで何とかなりそうでした。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板