この記事では、LabVIEWに関するクイズを出しています。
テーマはファイルIOです。
データをファイルに保存したり、ファイルからデータを読み出したりと、プログラムを書く上で頻繁に行う操作ですが、書き方を間違えると思った動作をしてくれません。
クイズを通して、関数の仕様や使い方について気づくこともあると思います。
詳細ヘルプなどの、LabVIEWのヘルプ情報を見ずに何問正解できるか挑戦してみてください。
問題編
以下、問題をそれぞれ取り上げます。
各問題の答えは、解答編を見てみてください。
ディレクトリの削除
削除関数に指定するパス入力で、実際に存在するディレクトリ(フォルダ)を指定した以下のプログラムを実行しても、対象となっているdelete targetディレクトリは削除されません。
権限の問題でもない場合、何をすればdelete targetディレクトリを削除できるようになるでしょうか?

解答はこちら
保存ファイルの選択をキャンセル
以下の図で示したプログラムを実行すると、どのファイルに保存するかのダイアログが表示されます。
このダイアログでキャンセルボタンを押すと、どのようなことが起きるでしょうか?

解答はこちら
ファイルサイズの設定
ある指定したサイズ以上のファイルを作らせないために使用することができる、ファイルサイズを指定関数は、以下のブロックダイアグラムでどちらの位置に配置すると効果があるでしょうか?(間違った位置の場合、指定したサイズ以上のファイルが生成されます)

解答はこちら
ファイルにフォーマットを既存ファイルに対して実行
ファイルにフォーマット関数を、既に存在しているファイルに対して以下のように実行した場合、samplefile.txtの中身はどのような結果になるでしょうか?

解答はこちら
ショートカットを移動する
以下のブロックダイアグラムで、sampledoc.txt – ショートカット、は実際に指定したパスに存在しているショートカットです。
このプログラムを実行したら、どのような結果になるでしょうか?

解答はこちら
tdmsの読み書き
以下の図のブロックダイアグラムのプログラムを実行した後、波形グラフはどのような結果になっているでしょうか?

解答はこちら
テキストファイルへの読み書き
以下の図のブロックダイアグラムのプログラムを実行した後、テキストはどのような結果になっているでしょうか?

解答はこちら
ファイルを閉じるときにエラー
以下の図のようなプログラムを実行した時、デスクトップ実行トレースツールキットでメモリリークは検出されるでしょうか?

解答はこちら
tdmsのindexファイルがない状態で読み取り
以下の図のプログラムを実行すると、tdmsファイルが保存されるパスと同じ場所にindexファイルも一瞬削除されますがすぐに削除関数によって削除されます。
その後に同じtdmsファイルにアクセスしていますが、プログラム全体が実行された後、波形データにはどのような表示がされているでしょうか?
また、indexファイルはどのようになっているでしょうか?

解答はこちら
ファイル書き込みの早さ
以下の二つのプログラムをそれぞれ実行した場合、生成されるファイルが同じ内容となる場合、②の方のプログラムの「?」にはどのような処理を書けばいいでしょうか?
また、どちらのプログラムが早く実行されるでしょうか、あるいはほとんど同じ速さで実行されるでしょうか?

解答はこちら
解答編
ではそれぞれの問題の解答を以下紹介します。
ディレクトリの削除
指定したディレクトリが空ではない場合、削除の関数にただそのディレクトリのパス情報を入力するだけでは削除できません。
しかし、「階層全体(F)」というブール入力にTrueを配線することで、指定した空ではないディレクトリを削除することができます。

問題に戻る場合にはこちら
保存ファイルの選択をキャンセル
ファイルを選ぶダイアログでキャンセルを押した場合、このブロックダイアグラムの形にしているとエラー43が発生します。
このエラーはユーザにより操作がキャンセルされた、というエラーで、まさに操作の通りのエラーです。
ファイルを開く/作成/置換の関数には、キャンセルされたかどうかをブール値で出力する機能があるため、ユーザーによるキャンセル操作に対して正しく処理が行えるよう、このブール値やエラー情報とケースストラクチャでキャンセル時処理を実装しておくようにするのがベターです。

問題に戻る場合にはこちら
ファイルサイズの設定
こちらはBの位置に設定する必要があります。
Bの位置にはなくAの位置にだけあってもファイルサイズは指定した大きさよりも大きくなることができるので注意が必要です。

問題に戻る場合にはこちら
ファイルにフォーマットを既存ファイルに対して実行
プログラム自体は実行することができエラーも発生しませんが、このプログラムの状態だと、データを書き込む位置が先頭から始まることになるため、以下のような結果が得られることになります。
続きから書きたい場合には、しっかりファイルの書き込み位置を「最後」からにする必要があります。

問題に戻る場合にはこちら
ショートカットを移動する
このプログラム、実行すると、エラー7が発生します。
エラー7は、「ファイルが見つかりません」というエラーです。
実はショートカットファイルは拡張子が.lnkとなっており、これを含めた形でプログラムを書く必要があります。
ただし、このように書いたとしても、「ショートカットファイル」そのものは指定先に移動しません。
代わりに、そのショートカットが参照していた元ファイル(この場合mysampledoc.txt)が移動します。
実際、プログラムを実行すると、mysampledoc.txtは元のパスから消えてしまいます。
ただし今度は別の問題が発生し、mysampledoc.txtファイル自体が「mysampledoc.txtのショートカット」として扱われるようになるようで、これを開こうとしても何も開きません。
そのため、ショートカットファイルそのものを移動の関数で動かすことはできず、またプログラムをエラーなく実行させる場合には、移動先のパスの指定時にファイル名ごと指定する必要があります。
(混乱を避けるためには、ショートカットの元となったファイルと同じ名前にするのが良いかと思います)

問題に戻る場合にはこちら
tdmsの読み書き
tdmsは読み書きが自在にでき、データをグループやチャンネルごとに保存しているため、問題なく書き込んだデータを読み出すことができます。

問題に戻る場合にはこちら
テキストファイルへの読み書き
このプログラムを実行した場合、テキストの部分には何も表示されません。
read/writeの指定をしているのになぜ?と思われるかもしれませんが、書込みを行っている時点で、このviの中での「ファイル位置」が一番最後にきているため、それ以降の内容(何もない)から読み取ろうとしても読み取れない、ということになります。
そのため、ファイル位置を先頭に設定することで、書き込んだ値を読み取ることができます。

問題に戻る場合にはこちら
ファイルを閉じるときにエラー
デスクトップ実行トレースツールキットで試すとわかりますが、ファイルを閉じる関数にエラー情報が配線されても、メモリリークは発生しません。
これは実はヘルプページにも記載があり、「このノードは実行前にエラーが発生していても通常どおり実行されます。」とのことで、エラーが原因でファイルを閉じられない、ということはないようです。

問題に戻る場合にはこちら
tdmsのindexファイルがない状態で読み取り
このプログラムを実行すると、最終的にはindexファイルが復活します。
そもそも、tdmsを開く関数には「指標ファイルを作成?(T)」という入力があり、これにより指標ファイル、つまりindexファイルが作成されます。
また、このファイルはtdmsファイルへのアクセスの速度向上のために使われますが必須ではないため、なくてもファイルの中身を読み取ることは可能です。

問題に戻る場合にはこちら
ファイル書き込みの早さ
結果を同じにするためには、配列からスプレッドシート文字列に変換を使用する方法が考えられます。
2つのviを実行した結果、timeに表示されるそれぞれの実行速度は明確に差が出て、毎回書き込む1の方法より、一度に書き込む2の方法が早くなります。
一般的なアプリケーション(LabVIEW以外)でも、ファイルへのアクセスというのは基本的に時間がかかる操作であり、それをこまめに書き込むのと、大量のデータであっても一度に書き込むのとでは、後者の方が効率が良くなります。

問題に戻る場合にはこちら
本記事の問題、全て難なく正解できたという方は、ファイルIOについてなかなか詳しいのではないかなと思います。
別にこれらの問題に正解できたかを気にする必要はなく、むしろ「こんな風に使い方気を付けないといけないんだな」、という気づきがあって少しでも役に立てばうれしいです。
ここまで読んでいただきありがとうございました。
コメント