プロデルで始める日本語プログラミング言語入門(#13)「ファイルを操作しよう」


プロデルでプログラミング入門連載の第13話目です。今回は、ファイルを取り扱う方法についての話です。ファイルは、作成したデータを出し入れするための情報の単位で、どんなタイプのアプリで使われる必要不可欠な機能です。今回は、テキストファイルを読み書きする方法や、ファイルのコピーや移動、ファイルパスについて紹介します。

テキストをファイルとして保存する

プロデルのプログラム上から新しいファイルを作るには、「保存する」手順を使います。

「こんにちは」を「readme.txt」へ保存する

ファイル名にフォルダが指定されていない場合、プロデルプログラム(拡張子が.rdrのファイル)があるフォルダに保存されます。そのため、実行する前にプログラムを保存しておきます。

保存した内容を読み込むには、「読み込む」手順を使います。

「readme.txt」から読み込んで報告する

メモ帳を作る

では早速ですが簡単なメモ帳アプリを作ってみましょう。

テキストボックスに書かれた内容を「memo.txt」へ保存できるようにします。また「memo.txt」の内容を開くこともできるようにします。

メイン画面を表示する
待機する
メイン画面とは
	ウィンドウを継承する
	はじめの手順
		初期化する
	終わり
	初期化する手順
		この実質大きさを{428,394}に変える
		この内容を「メモ帳」に変える
		初期化開始する
		保存ボタンというボタンを作る
			その位置と大きさを{146,348,112,34}に変える
			その内容を「保存」に変える
			その移動順を2に変える
		読み込みボタンというボタンを作る
			その位置と大きさを{28,348,112,34}に変える
			その内容を「読み込み」に変える
			その移動順を1に変える
		テキスト領域1というテキスト領域を作る
			その位置と大きさを{28,16,372,311}に変える
			その移動順を3に変える
		初期化終了する
		この設計スケール比率を{144,144}に変える
	終わり
	読み込みボタンがクリックされた時の手順
		もし「memo.txt」というファイルが存在するなら
			「memo.txt」から読み込んでテキスト領域1の内容を変える
		もし終わり
	終わり
	保存ボタンがクリックされた時の手順
		テキスト領域1の内容を「memo.txt」へ保存する
		「保存しました」と表示する
	終わり
終わり

ファイルを選択できるようにする

次に他のファイルへ保存できるように選択ダイアログを表示するように改良します。

保存先や読み込むファイルを選択するには、「開くファイルを選択する」手順「保存するファイルを選択する」手順を使います。この2つの手順の違いは、既存のファイルからのみ選択するか、存在しないファイル名も指定できるかどうか、ボタンが[開く]か[保存]かの違いです。

手順の返り値として、指定したファイル名が返ります。[キャンセル]ボタンをクリックした時は、無となります。また「フィルタ」設定項目を指定すると、選択できるファイルの種類を絞り込むことができます。

「読み込みボタンがクリックされた時の手順」と「保存ボタンがクリックされた時の手順」を改良して、ファイルを選択して読み書きするプログラムは、次の通りです。

読み込みボタンがクリックされた時の手順
	開く画面のフィルタを「テキストファイル|*.txt|すべてのファイル|*.*」に変える
	ファイル名は、開くファイルを選択したもの
	もしファイル名が無でなければ
		ファイル名から読み込んでテキスト領域1の内容を変える
	もし終わり
終わり
保存ボタンがクリックされた時の手順
	保存画面のフィルタを「テキストファイル|*.txt|すべてのファイル|*.*」に変える
	ファイル名は、保存するファイルを選択したもの
	もしファイル名が無でなければ
		テキスト領域1の内容をファイル名へ保存する
	もし終わり
終わり

文字エンコードを指定する

文字には、一文字ずつ文字コードと呼ばれる文字に固有の番号が付けられています。主に全角文字では、アプリやPCによって同じ文字に対して文字エンコードごとに文字番号が異なることがあります。

プロデルで通常テキストに使われる文字コードは、UTF-8形式です。「保存する」手順の「~で」を指定すると保存するテキストの文字コードを指定できます。

例えば、Shift-JIS形式で保存するには、次のように書きます。

「こんにちは」を「readme.txt」へ「Shift-JIS」で保存する

なお、読み込む時には自動的に文字エンコードをプロデルが判定してくれますが、文字エンコードがあらかじめ決まっている場合には、「読み込む」手順に「~で」を指定します。

「readme.txt」から「Shift-JIS」で読み込んで報告する

パスとは

ファイルを操作する際に、操作するファイルを表すパスで指定します。パスとは、ファイルやフォルダの置き場所を示した文字列のことです。例えばWindowsでは、次のようなパス文字列で書きます。

C:\Users\プロデル\Documents\発表.pptx
C:\Users\プロデル\AppData\Local\Programs\Produire\サンプル\
..\images\敵.png

パスの表記は、フォルダ名やファイル名を「/」(¥)で区切ったものです。

上記の「C:」は、ドライブ名(ドライブレター)を表します。SDカードやUSBメモリなど別のドライブの場合は「D:」「E:」などとなります。ドライブの直下の場所を「一番上にある場所」「ルート」とも言います。

「\」に続いてその中にあるフォルダ名を書き、「\」で区切りながらその中にあるフォルダ名を順番に書き連ねていきます。「\」が増えるほどフォルダが深い階層の場所にあります。

パスの最後は、ファイル名またはフォルダ名となります。最後がフォルダ名で終わる場合は、そのフォルダ全体を差します。

絶対パスと相対パス

パスには、絶対パスと相対パスという2つの書き方があります。

絶対パスは、最初に説明したドライブレターからはじまる目的のファイルやフォルダがある場所を完全に記したパスです。エクスプローラでフォルダを開き、アドレスバーを選択すると表れる文字列がそのフォルダの絶対パスです。

一方、相対パスは、ある決められた場所(作業フォルダや今の位置)を基準にして、どこに目的のファイルやフォルダがあるかを表記したパスです。作業フォルダを基準にその続きのパスを書けばよいという表記です。

目的のファイルが作業フォルダと同じフォルダにある場合には、相対パスとしてファイル名だけを書けば指定できます。作業フォルダの中(「子」「下の階層」ともいいます)にあるフォルダのファイルであれば「\」でフォルダ名を書き連ねて相対パスとして指定できます。

今の位置が「ゲーム」フォルダの時に「敵.png」を指定するには「..\images\敵.png」と書く

なお、作業フォルダよりも上の階層(「親」ともいいます)にあるフォルダに戻りたい場合には、「..」と書くとすぐ上にあるフォルダを指定できます。

例えば、
作業フォルダが「C:\Produire\サンプル\ゲーム\」となっている場合に
絶対パスでは「C:\Produire\サンプル\images\敵.png」となる場所を指定するには、
相対パスとして「..\images\敵.png」と書けば指定できます。

今の位置が「サンプル」フォルダの時に「敵.png」を指定するには「images\敵.png」と書く

パスを指定するファイル情報とフォルダ情報

ファイルやフォルダは、パス文字列を指定して操作するのが一般的です。ただしパスは文字列ですので、複雑なファイル操作をするときには文字列操作を伴うことがあります。親や子のフォルダを指定するときには、文字列の取り出しや連結をする必要があるのでプログラムとして書くとやや長く難しくなります。

そこでパスを簡単に指定する方法としてファイル情報フォルダ情報が用意されています。これらは、ファイルやフォルダをプロデル上のオブジェクトとしての操作するための種類です。

パス文字列からファイル情報を作るには、次のように書きます。ファイル情報を作ると、そのファイルがあるフォルダなどを得られます。

発表ファイルというファイル情報(「C:\Users\プロデル\Documents\発表.pptx」)を作る

//ファイルがあるフォルダを調べる
発表ファイルのフォルダを報告する

パス文字列からフォルダ情報を作るには、次のように書きます。フォルダ情報では、そのフォルダがある親フォルダなどを得られます。

サンプルフォルダというフォルダ情報(「C:\Users\プロデル\AppData\Local\Programs\Produire\サンプル\」)を作る

//親のフォルダを調べる
サンプルフォルダの親を報告する

また、プロデルプログラムと同じフォルダのフォルダ情報は、「今の位置」設定項目で得られます。

マイドキュメントやデスクトップなどの特別なフォルダは、その名前からフォルダ情報を取得できます。特別なフォルダは、基本フォルダに記載されています。

フォルダ情報では、そのフォルダの中にあるフォルダ情報を取得できます。例えばマイピクチャーにある「写真」フォルダのフォルダ情報を得るには、次のように書きます。

マイピクチャーから「写真」を取得して写真フォルダとする

ファイル情報とフォルダ情報には、次の図のような手順や設定項目が用意されています。それぞれオブジェクトから作成日や親子の情報を調べることもできます。

ファイル情報とフォルダ情報の手順と設定項目(一部)

フォルダに入っているファイルを列挙する

「フォルダ情報」種類を使うと、特定のフォルダにあるファイルを列挙できます。例えば、マイドキュメントの直下に入っているファイルの一覧を列挙するには、「ファイル一覧」設定項目を使います。

一覧は、マイドキュメントのファイル一覧
一覧を項目にそれぞれ繰り返す
	項目を報告する
繰り返し終わり

フォルダを列挙するには、「フォルダ一覧」設定項目を使い、次のようにプログラムします。

フォルダ一覧は、マイドキュメントのフォルダ一覧
フォルダ一覧のすべての要素についてそれぞれ繰り返す
	要素を報告する
繰り返し終わり

なお、マイドキュメントの中にあるフォルダを指定するには、「取得する」手順を使います。

マイドキュメントから「請求書\2020年\」を取得したもののフォルダ一覧

ファイルやフォルダのサイズを調べる

「ファイル情報」種類では、ファイルのサイズや作成日などの情報を取得できます。

デスクトップから「報告書.xlsx」を取得してそのサイズを報告する

デスクトップから「報告書.xlsx」を取得して報告書ファイルとする
報告書ファイルのサイズ表記を報告する

「すべて」後置子を使うと、特定のフォルダの合計ファイルサイズを取得できます。

マイドキュメントの全ファイル一覧すべてのサイズの合計のサイズ形式を報告する

ファイルの操作

今回はファイル情報とフォルダ情報を使ってファイルを操作する方法を紹介します。

なお、この2つの種類を使わずにパス文字列でファイルを操作するには、「ファイル操作」広域種類の手順を使います。一つのファイルを操作する場合には、文字列のパスで指定する方が便利です。また、複数のファイルを一度の操作する時には2つの種類を使う方がプログラムが簡潔になることもあります。2つの方法を状況や好みに応じて使い分けてください。

まずは、エクスプローラーで操作するようにファイルやフォルダをコピー、移動、削除する方法などを紹介します。

コピーする

「コピーする」手順を使えばファイルをコピーできます。

今の位置から「文章.doc」を取得して対象ファイルとする
対象ファイルを「文章.bak」へコピーする

「コピーする」手順ではコピー元をパス文字列で指定すれば、ワイルドカード(*や?)も使えます。

「[今の位置]*.jpg」をマイピクチャーへコピーする

移動する

「移動する」手順を使うとファイルやフォルダを別のフォルダへ移動できます。

今の位置から「プログラム.rdr」を取得して対象ファイルとする
対象ファイルをデスクトップへ移動する

「移動する」手順でも移動対象をパス文字列で指定すれば、ワイルドカード(*や?)も使えます。

「[今の位置]*.jpg」をマイピクチャーへ移動する

名前を変える

「変更する」手順を使えばファイルやフォルダの名前を変更できます。

今の位置から「文章.doc」を取得して対象ファイルとする
対象ファイルを「文章バックアップ.doc」に変更する

削除する

「削除する」手順を使えばファイルやフォルダを削除できます。

今の位置から「文章.doc」を取得して対象ファイルとする
対象ファイルを削除する

削除対象をパス文字列で指定すれば、ワイルドカード(*や?)を使えます。

「[今の位置]*.tmp」を削除する

フォルダを作成する

フォルダ情報を使うと、特定のフォルダに新しいフォルダを作成できます。

「ABC」というフォルダをデスクトップに作成する

写真のバックアップツールを作る

最後に、ドラッグ&ドロップされたファイルを作成日ごとにフォルダ分けしてコピーするツールを作ってみます。

例えばデジカメや一眼レフの写真ファイルは、連番でSDカードの一つのフォルダにまとめて保存されています。これでは写真を見ないと、撮影した時期がわかりませんので後から探す時に不便です。そこで写真ファイル用のコピーツールをプロデルで作ってみます。

ファイルのドラッグドロップ

「ドラッグドロップされた時の手順」を使うと、ファイルがドラッグ&ドロップされた時にそのファイル名を調べられます。このイベント手順は、対象となる部品の「ドラッグドロップ」設定項目を○(真)にしておきます。ドラッグ&ドロップされたファイル名は、「イベントのファイル一覧」で文字列の配列で取得できます。

メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する

	はじめの手順
		初期化する
	終わり

	初期化する手順
		この実質大きさを{417,366}に変える
		この内容を「ファイルのドラッグ&ドロップ」に変える
		初期化開始する
		ドロップラベルというラベルを作る
			その位置と大きさを{12,9,393,348}に変える
			その内容を「こちらにファイルをドラッグ&ドロップしてください。」に変える
			その文字配置を「中央」に変える
			その移動順を1に変える
			そのドラッグドロップを○に変える
			その位置固定方向を「上+下+左+右」に変える
		初期化終了する
		この設計スケール比率を{144,144}に変える
終わり

	ドロップラベルがドラッグドロップされた時の手順
		イベントのファイル一覧のすべてのパスについてそれぞれ繰り返す
			パスを報告する
		繰り返し終わり
	終わり
終わり

ファイルを日付ごとにフォルダ分けする

ドラッグしたファイルを日付ごとにフォルダに分けるプログラムを作ってみます。

「ドロップラベルがドラッグドロップされた時の手順」でドラッグされたファイルをひとつひとつ日付を調べ、その日付のフォルダにファイルをコピーします。フォルダ名はファイルの作成日時から決めます。例えば2020/8/21に作成されたファイルの場合、「2020年08月21日」という名前のフォルダをマイピクチャーに作成して、そのフォルダへコピーしていきます。

メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する

	はじめの手順
		初期化する
	終わり

	初期化する手順
		この実質大きさを{417,366}に変える
		この初期位置を「中央」に変える
		この内容を「ファイルのバックアップツール」に変える
		この間隔を{4}に変える
		初期化開始する
		ドロップラベルというラベルを作る
			その位置と大きさを{12,9,393,348}に変える
			その内容を「こちらにファイルをドラッグ&ドロップしてください。」に変える
			その文字配置を「中央」に変える
			その移動順を1に変える
			そのドラッグドロップを○に変える
			その位置固定方向を「上+下+左+右」に変える
		初期化終了する
		この設計スケール比率を{144,144}に変える
終わり

	ドロップラベルがドラッグドロップされた時の手順
		イベントのファイル一覧のすべてのパスについてそれぞれ繰り返す
			パス情報は、ファイル情報(パス)を作ったもの
			分類先は、フォルダ情報(「[マイピクチャー]\[パス情報の作成日を「yyyy年MM月dd日」に整えたもの]」)を作ったもの
			もし分類先が存在しないなら
				分類先を作成する
			もし終わり
			パス情報を分類先へコピーする
		繰り返し終わり
	終わり
終わり

バックアップする対象ファイルを絞り込む

バックアップする際に、特定のファイルをコピー対象から除外するには、「もし」文で条件を加えます。例えば、.jpgファイルのみをバックアップしたい場合は、「合致する」手順を使ってパターンマッチで対象ファイルを絞り込めます。

ドロップラベルがドラッグドロップされた時の手順
	【一覧】は、イベントのファイル一覧
	一覧のすべてのパスについてそれぞれ繰り返す
		対象ファイルは、ファイル情報(パス)を作ったもの
		分類先は、マイピクチャーから[対象ファイルの作成日を「yyyy年MM月dd日」に整えたもの]というフォルダを取得したもの
		もし分類先が存在しないなら
			分類先を作成する
		もし終わり
		もし分類先に対象ファイルの名前が存在しないかつ対象ファイルが「*.jpg」と合致するなら
			対象ファイルを分類先へコピーする
		もし終わり
	繰り返し終わり
終わり

また、ログファイルなどでバックアップの対象ファイルを日付で絞り込むこともできます。例えば、作成日が30日以内のファイルに絞り込む場合には、次のようなプログラムに書き換えます。

もし分類先に対象ファイルの名前が存在しないかつ(今日-対象ファイルの作成日)の日数が30以下なら
	対象ファイルを分類先へコピーする
もし終わり

日付時刻型は、引き算すると「日時期間形式」型の値になるので、日数や経過時間を計算できます。

対象ファイルの作成日は、「日時形式」型の値として取得できますので、今日から作成日を引くことで、経過日数を計算できます。『(今日-対象ファイルの作成日)の日数』と書くと、対象ファイルの作成日が今日から何日前かを計算できます。

まとめ


今回は、プロデルでファイルを操作する方法について紹介しました。ファイル情報とフォルダ情報は、少し煩雑に思えるかも知れませんが、プログラム中のファイル操作が日本語として読みやすく、後で見返しても分かりやすいのではないかと思います。これがプロデルならではの魅力の一つです。

後半に紹介したバックアップツールは、専用の便利な専用ツールがたくさんありますが、あえてプロデルを使って自分でプログラムを書いて楽しみながら作る、というのはどうでしょうか?出来合のツールのように複雑なオプションを覚えたり設定したりしなくてもよく、自分にとって、かゆい所に手が届くバックアップツールを作ることができるのが、自分でプログラミングすることの良い所です。

プロデルはバッチ定形の処理も得意ですので、ぜひ思い立った時にプロデルでファイルを整理するツールを作ってみてください。

プロデルで始める日本語プログラミング言語入門も実用編に入り、クライマックスになりました。もう少しシリーズは続きますので、次回もお楽しみに。

連載「プロデルではじめる日本語プログラミング入門」

※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製したり改変して掲載することを堅く禁止します

  • いいね (5)
  • 続編を読みたい (6)

コメントを残す