そこで今回はファイルアクセスの基本について説明することにしましょう。ファイルの種類でもっとも重要でかつ多様されるのはテキストファイルですから、まずは、テキストファイルの読み込みからやってみましょう。
ファイルの操作をする場合、まずプログラミングの前に下準備が必要となります。それは「そのアプリケーションで利用可能なファイルの種類を教える」という作業です。REALbasicは、デフォルトではファイルに関する何の情報も持っていません。プロジェクトを作る際に、ユーザーが必要に応じて設定しないといけないのです。
では、「Edit」メニューから「File Types...」を選んでください。画面にファイルタイプを設定するためのダイアログウインドウが現れます。
ここで「Add」ボタンをクリックし、新しいファイルタイプの設定を行います。現れたウインドウで、「Name」の右側にある上下の三角形マークをマウスでプレスすると、あらかじめ用意されているファイルタイプの一覧がポップアップメニューで現れます。その中から「application/text」を選んでください。これがテキストファイルのファイルタイプです。
これを選ぶと、Name、Mac Creater、Mac Type、Extentionのそれぞれに自動的に必要な設定が書き込まれます。
このままOKしてもいいんですが、「Extention」の項目は、書き込まれたデータをすべて消して空にしておいた方がいいでしょう。このExtentionというのは、いわゆる拡張子の設定です。Macではファイル名に拡張子をつけないことの方が多いので、これは空っぽにして「拡張子なしでもTEXTタイプのものはすべて認識する」というようにしたほうがいいでしょう。そしてOKすれば、「application/text」というファイルの種類がプロジェクトに設定されます。
1.FolderItemというオブジェクトを用意する。これはファイルやフォルダを扱うためのオブジェクトと考えればいい。
2.TextInputStreamというオブジェクトを用意する。これは、テキストを読み込むための専用オブジェクトのようなものだ。
3.用意ができたら、まず、FolderItemオブジェクトに、利用するテキストファイルを設定する。
4.設定したFolderItemオブジェクトから、テキスト読み込みのためのTextInputStreamオブジェクトを作って設定する。
5.できたTextInputStreamオブジェクトを開く。
6.TextInputStreamオブジェクトからテキストを読み込んで変数などに収める。
7.必要なテキストデータをすべて読み込んだら、TextInputStreamを閉じて終了。
なんて面倒だ!と思った人、あなたは正しい(笑)。ファイルの操作というのは、プログラミングをある程度覚えたところで最初にぶつかる壁のようなものです。かなりややこしい感じがしますが、手順さえきちんと覚えれば、決して理解できないほど難しいわけではありません。
また、今回は今まで登場したことのなかった「オブジェクト」というものが登場します。これは、ウインドウなどに配置する部品とも、変数とも違った感じのものです。これも、慣れない内はとらえにくい考え方かも知れません。
では、例として簡単なサンプルを作ってみましょう。Window1を開き、EditFieldとPushButtonを1つずつ作成してください。名前などはデフォルトのままでいいでしょう。そしてボタンをダブルクリックしてコードブラウザを開き、以下のように記述します。
Sub Action() Dim MyFile As FolderItem Dim MyStrm As TextInputStream MyFile = GetOpenFolderItem("application/text") if MyFile <> nil then MyStrm = MyFile.OpenAsTextFile EditField1.Text = MyStrm.ReadLine MyStrm.Close end if End Sub内容の説明はおいといて、Runしてボタンをクリックしてみましょう。画面にテキストファイルを選択するオープンダイアログが現れます。ここでファイルを選択すると、そのファイルの最初の行(つまり1行目)だけが読み込まれてEditFieldに書き出されますよ。
では、リストをざっと見てみましょう。
Dim MyFile As FolderItem
Dim MyStrm As TextInputStream
この2行で、「MyFile」という名前のFolderItemオブジェクトと、「MyStrm」という名前のTextInputStreamオブジェクトの宣言をしています。「オブジェクトを作る」というと、なんだか難しそうな感じがしますが、見てわかるように、変数の宣言となんらかわるところはありません。
オブジェクトというのは、「部品のようにさまざまなプロパティやメソッドなどをもった、複雑な変数」とでも思っていてください。つまり、Dimで変数と同じように宣言して使うのだけど、実際にはオブジェクト内のメソッドを呼び出したりして、まるでウインドウに配置した部品などと同じ感覚で扱うことのできるものなのです。
MyFile = GetOpenFolderItem("application/text")
ここでは、「GetOpenFolder」という関数を使ってオープンダイアログを呼び出し、そこで選択したファイルをMyFileに設定しています。このGetOpenFolderという関数は1つだけパラメータを持っており、そこにオープンダイアログで表示するファイルタイプを設定します。ここでは、先ほど作成した「application/text」を設定して、テキストファイルだけ表示するようにしてあるというわけです。
if MyFile <> nil then
次のif文では「MyFile <> nil」という条件を調べていますね。これは、先のGetOpenFolderItemでファイルを選択せずキャンセルしたときの処理です。キャンセルすると、MyFileの値はnilというものになります。このnilというのは「何にもない」状態を示す単語です。要するに、変数を宣言だけして何もいれてないような状態、と思えばいいでしょう。
MyStrm = MyFile.OpenAsTextFile
MyFileがnilでなければ、まずMyFileオブジェクトの「OpenAsTextFile」というメソッドを呼び出します。これは、MyFileオブジェクトをテキストファイルとして利用できるようにするTextInputStreamオブジェクトを返す働きを持っています。つまり、ここでMyFileからテキストを呼び出すTextInputStreamを作ってMyStrmに設定していた、というわけです。
EditField1.Text = MyStrm.ReadLine
ここでテキストの読み込みをしています。「ReadLine」というのは、そのTextInputStreamオブジェクトから1行(1段落というほうが正しいでしょう。要するに改行までのテキストです)だけ読み込んで返す働きをします。つまりここで、MyStrmから1行テキストを読み込み、EditField1のTextに設定する作業をしていたのですね。
MyStrm.Close
そして、最後にCloseメソッドを呼び出してMyStrmオブジェクトを閉じます。これで作業はすべて終わりです。
ここでは1行だけテキストを読み込みましたが、これはテキスト読み込みをするメソッド「ReadLine」が、1行だけしか読み込まないような仕様になっているからです。もしファイルのテキストすべてを読み込みたければ、繰り返しなどを使って何度もReadLineを呼び出せばいいでしょう。
Sub Action() Dim MyFile As FolderItem Dim MyStrm As TextInputStream Dim Str As String Str = "" MyFile = GetOpenFolderItem("textFile") if MyFile <> nil then MyStrm = MyFile.OpenAsTextFile Do Str = Str + Chr(13) + MyStrm.readLine Loop until MyStrm.EOF MyStrm.Close EditField1.Text = Str end if End Subこれがサンプルコードです。ここでは「Do〜Loop until」という繰り返し構文を使ってみました。これは、「until 〜」部分に定義した条件が正しくなるまで繰り返しを続けるというものです。
until部分には「MyStrm.EOF」というのが設定されていますね。このEOFというのは、そのオブジェクトがファイルの終わりまで来ていることを示すメソッドで、ファイルの一番最後まできていればtrueになります。つまりこれで最後まで読み込んだかどうかをチェックしているわけです。
また、ReadLineでは改行まで読み込みますが、改行コードそのものは読み込みません。そこで、読み込んだ文字列をまとめるときに「Str + Chr(13) + MyStrm.readLine」というやりかたをしています。「Chr」というのは、指定のASCIIコードのキャラクタを返す関数で、13は改行コードになります。つまり「Chr(13)」で改行コードを間に挟んで2つの文字列をまとめているというわけです。
1.まずFolderItemオブジェクトを用意する。これは読み込みと同じ。
2.「TextOutputStream」というオブジェクトを用意する。
3.用意ができたら、テキストを保存するファイルをFolderItemオブジェクトに設定する。
4.FolderItemオブジェクトからTextOutputStreamを作って設定する。
5.TextOutputStreamオブジェクトを使って実際に保存するテキストファイルを作る。
6.TextOutputStremオブジェクトを使ってテキストを保存する。
7.すべて保存したら、最後にTextOutputStremオブジェクトを閉じる。
ざっと見ると、いくつかの違いがわかってきます。TextInputStreamの代りにTextOutputStreamというのが登場しますね。そしてファイルを開いて読み込む作業の代りに、ファイルを作成して書き込むという作業を行っています。まあ、全体的な流れはかなり似ているといってよいでしょう。
それでは、先ほどのプロジェクトにボタンを1つ追加して、そこにEditField1のテキストを保存するプログラムを作成してみましょう。
Sub Action() Dim MyFile As FolderItem Dim MyStrm As TextOutputStream MyFile = GetSaveFolderItem("application/text","MyData") if MyFile <> nil then MyStrm = MyFile.CreateTextFile MyStrm.WriteLine EditField1.Text MyStrm.Close end if End Sub非常に似ていますね。読み込みと書き出しは対になる機能ですから、使う命令も似ています。Runして、EditField1に適当に文字を書き込み、ボタンをクリックしてみてください。画面にファイル保存用のダイアログが現れます。ここにファイル名を入力して保存すれば、EditField1のテキストがファイルに保存されます。後で実際にテキストエディタなどを使ってファイルにちゃんと保存されているかどうか確認するとよいでしょう。
では、このソースコードをざっと説明しましょう。
Dim MyFile As FolderItem
Dim MyStrm As TextOutputStream
まず、オブジェクトの宣言ですね。ここでFolderItemとTextOutputStreamを定義しています。
MyFile = GetSaveFolderItem("application/text","MyData")
次に、「GetSaveFolderItem」という関数を使って、保存ダイアログを呼び出し、そこで入力したファイルをMyFileオブジェクトに設定しています。このGetSaveFolderItem関数はパラメータが2つあります。1つ目はダイアログに表示するファイルタイプで、2つ目はデフォルトのファイル名です。
if MyFile <> nil then
MyStrm = MyFile.CreateTextFile
またMyFileがnilかどうかチェックして、MyFileの「CreateTextFile」というメソッドを呼び出しています。これは、MyFileオブジェクトを実際のファイルとして作成するメソッドです。先ほどのGetSaveFolderItemメソッドは、ファイルを選ぶだけで実際にはファイルを作りません。ここで初めてファイルが作成されるのです。
MyStrm.WriteLine EditField1.Text
ここで「WriteLine」というメソッドを使ってテキストをMyStrmオブジェクトに書き込みます。このWriteLineは、その後にあるテキストをオブジェクトに書き込むメソッドです。
注目すべきは、ReadLineと違って1行だけしか書き込めないわけではなく、改行された複数行のテキストを設定してもちゃんとすべて書き込んでくれることです。「WriteLine」という名前ですが、改行したテキストを送ってやればまとめて書き込めるのです。
MyStrm.Close
そして最後にMyStrmをCloseで閉じて終了です。
いかがです、ファイルの読み込みがわかれば、書き込みは意外と簡単でしょう? ファイルの読み書きは、手順が面倒なので敬遠しがちですが、順番通りにメソッドを呼び出せば意外に簡単にファイルアクセスできてしまうものです。ここではとりあえずテキストファイルだけ説明しましたが、もちろん他の種類のファイルもREALbasicでは読み書きできるので、テキストをマスターした人は挑戦してみましょう。