ファイルパスの指定に慣れる | マーブルルール

ファイルパスの指定に慣れる

その他

スポンサーリンク

この記事では、プログラムを作成するにあたって重要なファイル管理に関する「ファイルパス」の扱いについて解説しています。

ある程度以上の規模のプログラムではファイルIOの操作がほぼほぼ必須になると思います。

そんなとき避けて通れないのがファイルパスの取り扱いです。

相対パスによる指定はもちろん、ある基準となるパスを基に相対パスを作成するような方法もあり、この「ある基準」はファイル定数として用意されています。

これらを区別して正しく使用することで、ファイルの扱いが楽に、便利になります。

スポンサーリンク

ファイルパス定数の実行結果

プログラムを作るうえで、ファイルを扱うという操作は頻繁に行われると思います。

プログラムを扱う上で登場する「ファイル」には例えば

  • プログラムそのもの(.vi。リファレンスによってサブVIを呼び出す場合にviファイルパスを使用)
  • プログラム中で取得したデータを保存したファイル(.txtや.csvなど)
  • プログラムの設定を保存したファイル(.iniや.jsonなど)

が挙げられます。

どの種類のファイルであっても、「このPCのここにあるファイル」、という指定が必要となるので、上記の用途でファイルを扱う場合にファイルパスの指定方法を決める必要があります。

ここで頻繁に使用するのが「ファイル定数」です。

この定数は、ある特定のパスを取得してくれるため、ちゃんと使いこなせばパスの指定を簡潔にすることができます。

以下では、次の6種類のファイル定数の結果について比較します。

  • 現在のVIのパス
  • デフォルトディレクトリ
  • デフォルトデータディレクトリ
  • VIライブラリ
  • アプリケーションディレクトリ
  • 一時ディレクトリ

これらはどれもファイルIOの関数パレットの中にあります。

これらの関数が使用される状態によって、それぞれの定数から得られるパスが異なることがあるので、以下で紹介していきます。

プロジェクトに属さないVIで実行した場合

まずは、プロジェクトエクスプローラに入っていない、単体のVIとして存在するVIでこれらのファイル定数を実行した場合の結果です。

なお、実行するプログラムであるvi自体は以下のパスの中に入っているとします。

C:\Users\pcuser

ユーザーフォルダの中のpcuser(ユーザー名がpcuserという名前のPCを使用しています)フォルダの中にあるvi上でファイル定数を使用したときの結果が以下に示した図の右側に表示されています。

これらでパスを取得してから、あとは「パス作成」や「パスをストリップ」で相対的なパスを調整し望みのパスを指定します。

なお、パス定数の中で「デフォルト」と名の付く、デフォルトディレクトリ、デフォルトデータディレクトリ、そして一時ディレクトリは、「デフォルト」を変えることでカスタマイズすることができます。

これはツールメニューのオプションから設定できます。

プロジェクトに属するVIで実行した場合

次に、プロジェクトに属したVIで実行した場合の結果です。

こちらでは、メインVIに対してサブVIを設けています。

このサブVIは、プロジェクトファイル(.lvproj)やメインVIがある階層からさらに下の階層(subsフォルダ)に保存されているとします。

具体的には

C:\Users\pcuser\myprogram

にプロジェクトファイルやメインVIがあり、

C:\Users\pcuser\myprogram\subs

にサブVIが入っているような状態、ということになります。

メインのVIとこのような位置関係がある場合、メインVI上でファイル定数を実行した場合とサブVIの中でそれらを実行した際に、それぞれ以下のようにパスの情報を取得できます。(「現在のVIのパス 2」などと、「2」がついているものが、サブVI上で取得したファイル定数の値になっています)

見てわかる通り、「現在のVIのパス」定数以外は同じ結果を示しています。

EXEで実行した場合

最後に、EXEの状態で実行した場合の結果です。

EXEの名前はmytestApplication.exeとしていて、一つ上で紹介した、メインVIの中にサブVIがあるプログラムをビルドしたものです。

このように、VIの状態とEXEの状態とでは、一部のパスが異なる場合があります。

そのため、プログラムを作っていく中で、最終的にはEXEにするけれど、開発時にはVIの状態でプログラムを動かして動作を確認する、という場合にどちらにも対応したパスを一つ決めるということが難しくなります。(「デフォルト~」の定数を使用する手がありますが、それらを使いたくない場合)

そんなときには、条件無効ストラクチャを使用して、VIの場合とEXEの場合とで異なる内容を実行させるように条件分岐させることで、VIでもEXEでもどちらの状態にも対応したプログラムを作れます。

条件無効ストラクチャ自体は、VIとEXEを区別する以外の設定もできるので、今回の用途で使えるように正しく条件の設定を行っておきます。

あとはケースストラクチャと同じような使い方になります。

下の図の上の結果はRUN_TIME_ENGINE==FalseということでVIの状態で実行した場合の表示がなされている一方で、下の結果はRUN_TIME_ENGINE==TrueということでEXEの状態で実行した際に文字列表示器に指定した文字が表示されていることがわかります。

システムに即したパスを取得するための関数

上で紹介した関数のうち、特にアプリケーションディレクトリを使用することで、アプリケーションを基点にしたパスを指定できることがかなり便利だと思うのですが、一方で、アプリケーションの場所と関係がないパスを指定したい場合もあると思います。

そんなときに役立つのが「システムディレクトリを取得」の関数です。

名前の通り、システム(使用環境)に即したパスを取得してくれて、プログラムの場所とは関係ないパスを扱う場合に用いることができます。

列挙体定数で指定ができるのですが、例えば「ユーザー」の関連で指定できるパス情報は以下のようです。

実行しているVIがそのPC上のどこにあろうと、同じPCを使用しているのであれば常に同じパスを取得します。

これ以外にも、「パブリック」の関連だったり、いくつか種類があるので、そちらも以下で紹介しています。

どのようなパスを指定すべきかはアプリケーションの要件で決まっていることも多いと思うので、しっかり区別してこれらのファイル定数を扱えるように心がける必要があります。

本記事では、「ファイルパス」の扱いについて紹介しました。

空のパス定数に直接ファイルパスを全て文字で指定する方法は手っ取り早いこともあるのですが、それだとシステムが変化してユーザー名も変わることですぐに使えなくなることが多くなります。

そんなパス名で指定するよりは、どのようなシステムでも使えるパス名にすることに越したことはないので、今回の記事で紹介した各定数を駆使できるようになることは重要です。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました