2015年3月7日土曜日

VB アプリの実行時のカレント・ディレクトリ

さて、恥を晒す様で、躊躇していますが ... 。  何かのお役に立てばと、残して置きます。
VB 等で、実行ファイルの場所を確認する時、
System.Environment.CurrentDirectory 等のプロパティを使って、取得する訳ですが、
これは、プロジェクトやソリューションを保存する前と後とで異なるって、 ご存知でしたか。


実は、試しに少し、ちょこちょこっと書いたサンプルコードで嵌ってしまいました。  あれぇっ て。

System.Environment.CurrentDirectory 等の結果は、
確か、 C:¥Users¥UserName¥Documents¥Visual Studio 20xx¥Projects¥WindowsApplicationyyyymmdd¥WindowsApplicationyyyymmdd¥bin¥Debug
になる筈なのですが。
今は、 C:¥Users¥UserName¥AppData¥Local¥Temporary Projects¥WindowsApplication20150303¥bin¥Debug
です。
AppData¥Local 配下に、Temporary Projects ですって ?。
Documents¥Visual Studio 20xx¥Projects¥WindowsApplicationyyyymmdd 配下 じゃぁ、ないのですか?。

これは、アプリを新規作成して、未保存の状態で、デバッグ実行した場合の、結果です。
Ctrl+F5 で リリース しても、同じ配下の Release にあります。
ちゃっと、ファイルを保存すれば、 見慣れた Visual Studio 20xx 配下に移動されます。

あ~、焦ったぁ。


さて、これだけなら、何も、投稿に残すほどでは ありませんね。
馬鹿か おまえ、 で終わりです。
                     大体、デバッグもせずに、書き上がるアプリはないので、 ファイル保存しない事はないですから 。


では、何で、書く気になったか。

AppData¥Local 配下 って、何処かで見ませんでしたか。

そう、AppData¥Local¥CompanynName¥ProjectName とか AppData¥Local¥Apps¥2.0 ですね。

Application.UserAppDataPath で 取得される データディレクトリ や、
ClickOnce で発行される アプリケーション を、 思い出して見て下さい。

      上記の例の データディレクトリ は、データベース利用時の 似た名前のもの とは異なります。
      尚、データベースの場所を既定する |DataDirectory|  は、
      通常の配置の場合には、 実行ファイル( xxx.exe  )が置かれた場所
      ClickOnce の場合には、 AppData¥Local¥Apps¥2.0¥Data 配下の既定の場所の様です。
      ASP.NET の場合には、App_Data フォルダ だそうです。  Compact 使うのかなぁ ... 。
                                           以上、SQL Server Compact の例
      |DataDirectory|  は、AppDomain.SetData("DataDirectory", objValue) によって指定される、
      とありますから、 。 Ref : https://msdn.microsoft.com/ja-jp/library/cc716756%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
      同じ様に、AppDomain.GetData("DataDirectory") で取得できるもの と思います。
             試していません。.
             はり、知識不足ですね。  上の方法は駄目です。  取消線 表記部分。
                              上の方法は、規定の場所から変更する場合に用いる様ですね。
             xxxTableAdapter.Connection.DataSource でフルパス取得するのが手っ取り早いです。


話は変わりますが、
こんな所にも、アプリ(ソフト)やデータ が、存在している訳ですね。

また、AppData は ユーザープロファイル 配下ですから、 個々のユーザー毎に独立しています。


   プログラミング言語に関心のない方へ。 
   
   この事は、 プログラムやソフトやアプリが、 何も、 Program Files や Program Files(x86) ばかりにあるとは限らない、
   と言う事を意味します。
   同様に、 ユーザー・プロファイル 配下 の AppData 等には、ソフトを実行する上でのデータが蓄積されています。
   場合によっては、ソフトそのものが入っています。

   稀に、AppData 以下のフォルダが巨大なので消してもいいですか 等と言うエンドユーザーの質問や回答がありますが、
   上の様な位置付けですので、無闇に弄らない事をお勧めします。

   勿論、インストローラーを使わず、ファイルコピーで動くソフトもある訳ですが、
   それ以外にも、ユーザー・プロファイル(ユーザーのデータ) の奥深くに、潜り込むものがある と覚えて置いて下さい。



あっ、そうそう、重要な点を忘れていますね。

冒頭に書いた、 実行ファイルの場所を確認する時の System.Environment.CurrentDirectory は、正確ではありません。
実行ファイルの場所ではなく、 実行時の作業ディレクトリを示します。
既定では、 実行ファイルが格納されているフォルダが作業ディレクトリになりますが、
アイコンのプロパティで 作業ディレクトリの変更 が可能です。
その場合、 実行ファイルが格納されているフォルダと 作業ディレクトリと が異なる設定も可能です。
                                                    それで、動くか否かは、別問題。.

ですから、  Application.StartupPath か System.AppDomain.CurrentDomain.BaseDirectory ですね。
VB ならば、強い味方、  My.Application.Info.DirectoryPath も使えます。



開発環境の からくり は、実に巧妙で複雑ですね。



[2015/03/07] 外部リンクが ページ書き換えになっていたのを 別ページで開くに 変更

0 件のコメント:

コメントを投稿