Section.8で、ちょっと書いたのだが、ファイルのクラス化について、色々と要望が有ったので、速攻やってしまおう。前項では、class CoolFnameとclass CoolFile : public CoolFnameの様にコントロールしようと思っていたが、一回造ってみたら、継承しているCoolFnameから、いちいちファイル名を取り出したり、ハンドルを送ったり…と、返って複雑になってしまったので、class CoolFile一本にまとめる事にした。ついでにPrivateProfileの方もクラス化した。一応、サンプルも動作しているのだが、中の動作が分かりづらいので、前項の様な制御方法が好きだという人は、無理に使わない方が良いかも知れない。また、ここでサンプルとして作成したクラスは、一般的にツール程度で使う事を目的としていて、高度なファイル処理を行う為にはちょっと役不足な点もあるので、本格的に使いたい場合は、少々拡張した方が良いだろう。
※以下、クラス化したサンプルの説明をするが、実は、厳密な動作確認は行っていないので、サンプルで使っている以外の関数が、動作するかは不明である。
- クラス化の目的(class CoolFile)
ここで、ファイル操作をクラス化する最大の目的は、処理の記述を簡潔にしたいという一点である。Windowの部品クラスを定義した時もそうだったが、色々と指定する項目が有って、面倒臭いと言うのが大きな理由なのである。
- コンストラクタ(インスタンス化)
CoolFileは、コンストラクタの引数として、親Windowのハンドルを指定する仕様とした。これは、HWND_DESKTOPでも問題無いのだが、ドラッグ・ドロップを使用すると、動作がどうなるか分からなかったので、この指定でのドラッグ・ドロップは不可とした。
例)
CoolFile *datafile ;
datafile=new CoolFile(hwnd) ;
|
- ファイル名の指定
CoolFileの仕様として、いずれかの方法にて、ファイル名を指定しないとオープン出来ない様になっているので、まず、ファイル名を指定する必要が生じるのだが、ここでの入力方法は以下の通り用意した。
- 直接入力する。RegistFname()
- ダイヤログボックスを開いて入力する。
Open用 FOpenDlg()
Save用 FSaveDlg()
- コマンドラインからの入力で決定する。CommLineFilename()
→最初のトークンだけを使用
- ドラッグ・ドロップされたファイル名で入力する。
許可/禁止 DropAccept()
→最初にドロップされたもののみ採用
注)メッセージハンドルはメイン側で行い、RegistDropFile()で登録する。
また、出力として、ファイル名本体と登録状況を返すメンバ関数GetFname()を用意しておく。
- ファイルを開く/閉じる
ファイルを開く場合は、Open()関数を呼べば良いのだが、引数として、ファイルを開く方法を指定する必要が有る。ここで指定出来る値は、次の3項目の組み合わせである。
- FT_WRITE 書き込み用に開く
- FT_READ 読み出し用に開く
- FT_BINARY バイナリファイルとして開く
尚、Openに成功した場合はTRUE,失敗はFALSEを返す。
ファイルを閉じる場合は、Close()関数を呼べば良い。クラスを消去(delete)しても開いていた場合は閉じられるが、流れ的に、Close()で閉じた方が分かり易いと思う。また、一旦Closeすれば、そのクラスは、別のファイル名を指定して、別のタイプで開くという事も可能である。
例)バイナリファイルを読み込み用に開く〜閉じる
if(!datafile->Open(FT_READ|FT_BINARY)) return 0 ;
…ファイル入出力処理
…
datafile->Close() ;
|
- ファイルの入出力
入出力用として、以下の関数を用意したが、簡単な関数なので、詳細な説明は割愛する。
- Getc() 一文字取得
- Putc() 一文字出力
- GetStringnoLF() 一行取得(改行文字無し)
- GetString() 一行取得(改行はそのまま)
- PutString() 一行書き出し(改行はユーザ指定)
- ファイル制御
その他の制御用として、以下の関数を用意したが、簡単な関数なので、詳細な説明は割愛する。
- FileSize() ファイルのサイズを取得する(ファイルを開く前に使用可)
- FilePos() 開いているファイルポインタの位置を得る
- SetFilePos() 開いているファイルポインタの位置を移動する
- CoolProfile
どちらかと言うと、こちらの方がクラス化の甲斐が有ったと思う。いちいち、GetPrivateProfileStringなどという長文を書かなくても良くなっただけでも有り難いと思わなければならない。
- CoolProfileコンストラクタ(インスタンス化)
CoolProfileは、コンストラクタの引数として、ファイル名を引数として生成する仕様とした。通常は、実行ファイル名に従って指定すれば良い。
- CoolProfile入出力
プライベートプロファイルは開く,閉じるという作業はユーザがハンドルするものでは無いので、ファイル名を指定してインスタンス化したら、そのまま下記の入出力を使用すれば良い。
- WriteSentence() 設定の追加/変更(文字列)
- WriteValue() 設定の追加/変更(int型変数)
- GetValue() 設定の読み出し(int型変数)
- GetString() 設定の読み出し(文字列)
また、設定の読み出し時のデフォルトは、クラス全体でデフォルト値を持っているが、変更したい場合は以下を使用する事が出来る。
- SetDefaultIntValue() GetValue時のDefaultを指定(DEFAULTは0)
- SetDefaultString() GetString時のDefaultを指定(DEFAULTは'DEFAULT')
- SetDefaultStringLength() GetString時の最大長を指定(DEFAULTは256文字)
- サンプル
今回のサンプルは、前回のファイル処理のみをクラス化しただけである。スッキリしたと感じる人も居るし、返って分かりづらいと思う人も居るかも知れない。この辺りは、好みで使い分ければ良いのでは無いだろうか?
テストサンプル010
※因みにパスワードはtest010となっている。
|