2013年2月5日火曜日

VB 参照ファイルの扱い

皆さん、プログラミングしてますか?
最近 PC 新調に伴い、開発環境を移動しているのですが、ちょっと気になった事に出くわしましたので。
それは、プログラム内からのファイルの呼び出しに関してです。
絶対パスで記述していましたが、思わぬ落とし穴に。


参照ファイルと言っても、DLL やライブラリ類ではありません。
自作ソフトが書き出し読込む外部ファイルです。

今までは、環境が変わっても、OS や 開発環境、ユーザーデータは単独の C ドライブにありました。
安心して、定数もしくは変数の一部に、文字列で、"C:¥Users¥UserName¥Documents¥AppName¥Ref.txt" などと書いていました。
外部に置くデータ類のファイル (例えば、実行時の環境設定データ等) は同じ絶対パスになる筈でした。
利用するユーザー名も予測できますので、大きな問題には出会わず、PC を変えてもトラブルに遭遇する事はありませんでした。

新調 PC は、今、流行のSSD + HDD の構成で、ユーザー絡みのフォルダは C ドライブではありません!
ですから、同一ユーザー名でも、PC が変わるとドライブ名が変わってしまうのです。

C ドライブ以外に置いたフォルダを扱う場合は、PC によってドライブ名が異なるのが通常ですから、
必要に応じファイルに情報を落として参照したりもしていました。


しかし、一般的なファイルを参照するのに、位置情報まで、別個のファイルに置くのは、何だか。
また、環境変数から、わざわざ持って来るのも、スマートじゃないし。
そうです! VB を習い始めた頃に読んだ、あれ!です。
My.Computer.FileSystem.SpecialDirectories.MyDocuments (例) を使います。
文字列の例・問題あり
"C:¥Users¥UserName¥Documents¥"         C: が環境に依って変化 例) D:

推奨
My.Computer.FileSystem.SpecialDirectories.MyDocuments + "¥"

(参考)環境変数から取得
System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "¥"
もしくは
System.Environment.GetEnvironmentVariable("USERPROFILE") + "¥Documents¥"


新調 PC を設定している最中から、予想はしていましたが、なかなか対応する機会が無くて ... 。 (単に横着なだけ)
暇な時を見付けて、今まで書いたものを訂正しなければ ... 。  あ~面倒


(追補)
訂正を始める前に、新調 PC 上で Exists や File Write するテストプログラムを作り実施してみました。
C:¥Users は D:¥Users への Junction が設定してある為、共に、問題が無い事が判明!
ちゃんと、実体の File や Directory を処理し、仮想 ( Junction ) への Access も問題無い様です。
しかし、今後のメンテを考えると、上記の様にちゃんと呼出関数を使って書いておいた方が良さそうですね。
以前書いたプログラムも大半はちゃんと呼出関数を使ってありました。 何だか、感激! えらかったなぁ、ちょっと前の自分。
やはり、具体的なパス名で記述するより、アプリに探させた方が、合理的で汎用性が高いでしょう。

話は変わって、Junction って便利ですねぇ。 有難さが良く分りました。 もっと、使おうっと!



[2013/02/15] (追補) を追加

0 件のコメント:

コメントを投稿