
ファイルやディレクトリを操作する
- ファイルやディレクトリをコピーする
- ファイルやディレクトリを移動する
- ファイルやディレクトリを削除する
- ディレクトリを作成する
- ファイルやディレクトリの存在を確認する
- ファイルのサイズを取得する
- ディレクトリ内のファイルを列挙する
- パスの一部を抜き出す
- 自身の実行ファイルのディレクトリパスを取得する
- 特殊なディレクトリのパスを取得する
テキスト、バイナリファイルを読み書きする
- テキストファイルを読み込む
- バイナリファイルを読み込む
- テキスト、バイナリファイルの終端を判定する
- テキストファイルを書き込む
- バイナリファイルを書き込む
- テキスト、バイナリファイルのアクセス位置を操作する
XMLファイルを読み書きする
1ファイルやディレクトリを操作する
Kuinではファイルパスの区切り文字には「\」は使わず「/」を使い、ディレクトリパスを表すときには終端に「/」を付けます。 つまり「"a\b\c"」とは書かずに、「"a/b/c/"」と書きます。
Kuinの標準ライブラリの関数の引数は、編集対象を先に指定する順番で統一しています。 このため、コピー関数の引数は「コピー先, コピー元」の順になりますのでご注意ください。
1.1ファイルやディレクトリをコピーする
ファイルをコピーするには「file@copyFile(コピー先パス, コピー元パス)」とし、ディレクトリをコピーするには「file@copyDir(コピー先パス, コピー元パス)」とします(図1-1)。
- func main()
- var b: bool
- do b :: file@copyFile("dst_dir/dst_file.txt", "src_dir/src_file.txt")
- do b :: file@copyDir("dst_dir/", "src_dir/")
- end func
これらの関数は、コピーが成功すると「true」、失敗すると「false」を返します。 また「file@copyDir」関数は中身のサブディレクトリやファイルも一緒にコピーされます。
1.2ファイルやディレクトリを移動する
(この記事は執筆中です!)
1.3ファイルやディレクトリを削除する
ファイルを削除するには「file@delFile(パス)」とし、ディレクトリを削除するには「file@delDir(パス)」とします(図1-2)。
- func main()
- var b: bool
- do b :: file@delFile("dst_dir/dst_file.txt")
- do b :: file@delDir("dst_dir/")
- end func
これらの関数は、削除が成功すると「true」、失敗すると「false」を返します。 削除対象が存在しない場合には、何もせずに「true」が返ります。
また「file@delDir」関数は中身のサブディレクトリやファイルも一緒に削除されます。
1.4ディレクトリを作成する
ディレクトリを作成するには「file@makeDir(パス)」とします(図1-3)。
- func main()
- var b: bool :: file@makeDir("dst_dir/")
- end func
「a/b/c/」としたとき、「b」と「c」のディレクトリが存在しない場合には「b」も「c」も作成されます。
またディレクトリの中身は空になります。 「a/b/c/」としたとき、「b」と「c」のディレクトリが既に存在していた場合、「b」の中身はそのままですが、「c」の中身のサブディレクトリやファイルはすべて削除されます。
1.5ファイルやディレクトリの存在を確認する
ファイルやディレクトリが存在しているかどうかを取得するには「file@exist(パス)」とします(図1-4)。
- func main()
- var b: bool
- do b :: file@exist("dst_dir/dst_file.txt")
- do b :: file@exist("dst_dir/")
- end func
存在していれば「true」、していなければ「false」が返ります。
1.6ファイルのサイズを取得する
ファイルのサイズを取得するには「file@fileSize(パス)」とします(図1-5)。
- func main()
- var size: int :: file@fileSize("dst_dir/dst_file.txt")
- end func
戻り値の単位はbyteです。
1.7ディレクトリ内のファイルを列挙する
(この記事は執筆中です!)
1.8パスの一部を抜き出す
ファイルパスから、ディレクトリ部分を抜き出すには「file@dir」を使い、拡張子を除いた部分を抜き出すには「file@delExt」を使い、拡張子を抜き出すには「file@ext」を使い、ファイル名を抜き出すには「file@fileName」を使います(図1-6)。
- func main()
- var dst: []char :: "dst_dir/dst_file.txt"
- var s: []char
- do s :: file@dir(s) {"dst_dir/"}
- do s :: file@delExt(s) {"dst_dir/dst_file"}
- do s :: file@ext(s) {"txt"}
- do s :: file@fileName(s) {"dst_file.txt"}
- end func
1.9自身の実行ファイルのディレクトリパスを取得する
自身の実行ファイルファイル(.exe)が存在するディレクトリパスを取得するには「wnd@exeDir()」とします(図1-7)。
- func main()
- var path: []char :: wnd@exeDir()
- end func
1.10特殊なディレクトリのパスを取得する
デスクトップなどの特殊なディレクトリのパスを取得するには「wnd@sysDir(特殊なディレクトリの種類)」とします(図1-8)。
- func main()
- var s: []char
- do s :: wnd@sysDir(%appData) {アプリケーションデータ}
- do s :: wnd@sysDir(%desktop) {デスクトップ}
- do s :: wnd@sysDir(%fonts) {フォント}
- do s :: wnd@sysDir(%programFiles) {ProgramFiles}
- do s :: wnd@sysDir(%system32) {System32}
- do s :: wnd@sysDir(%windows) {Windowsディレクトリ}
- end func
2テキスト、バイナリファイルを読み書きする
2.1テキストファイルを読み込む
テキストファイルを読み込むには、「file@makeReader(パス)」でファイルを開いてから、各種メソッドでデータを読み込み、最後にfinメソッドでファイルを閉じます(図2-1)。
- func main()
- var handle: file@Reader :: file@makeReader("text_file.txt")
- do handle.delimiter(['\n', ',']) {区切り文字の設定}
-
- var s: []char :: handle.readStr() {文字列を読み込む}
- var i: int :: handle.readInt() {整数を読み込む}
- var f: float :: handle.readFloat() {小数を読み込む}
- var c: char :: handle.readChar() {文字を読み込む}
-
- var c2: char :: handle.readLetter() {区切り文字を無視して1文字読み込み}
- var s2: []char :: handle.readLine() {区切り文字を無視して1行読み込み}
- do handle.fin()
- end func
file@Readerクラスの「delimiter」メソッドで区切り文字の配列を登録すると、「readStr」「readInt」「readFloat」「readChar」メソッドはそれらの文字が出てくるまでを読み込んで返します。
読み込んだデータが想定している型と一致しない場合には例外が発生しますので、どの型になるかが判らないときには「readStr」で読み込んで「toInt」「toFloat」メソッドなどで変換してください。
「readLetter」「readLine」メソッドは区切り文字を無視して読み込みます。
2.2バイナリファイルを読み込む
バイナリファイルを読み込むには、テキストファイルと同様「file@makeReader(パス)」でファイルを開いてから、readメソッドでデータを読み込み、最後にfinメソッドでファイルを閉じます(図2-2)。
- func main()
- var handle: file@Reader :: file@makeReader("binary_file.bin")
- var size: int :: handle.fileSize() {ファイルサイズの取得}
- var bin: []bit8 :: handle.read(size) {指定したbyte分だけバイナリを取得}
- do handle.fin()
- end func
2.3テキスト、バイナリファイルの終端を判定する
テキストファイルやバイナリファイルの読み込み時に終端を判定するには、file@Readerクラスの「term」メソッドを使います(図2-3)。
- func main()
- var handle: file@Reader :: file@makeReader("text_file.txt")
-
- while(!handle.term()) {終端でなければ処理を繰り返す}
- var s2: []char :: handle.readLine() {1行読み込み}
- end while
-
- do handle.fin()
- end func
termメソッドは、もう読み込めるデータがなければtrue、まだ残っていればfalseを返します。
2.4テキストファイルを書き込む
テキストファイルを書き込むには、「file@makeWriter(パス, 新規ならfalse、追記ならtrue)」でファイルを開いてから、各種メソッドでデータを書き込み、最後にfinメソッドでファイルを閉じます(図2-4)。
- func main()
- var handle: file@Writer :: file@makeWriter("text_file.txt", false)
- do handle.writeStr("ABC") {文字列を書き込む}
- do handle.writeInt(1234) {整数を書き込む}
- do handle.writeFloat(0.123) {小数を書き込む}
- do handle.writeChar('X') {文字を書き込む}
- do handle.fin()
- end func
既にファイルが存在していた場合、file@makeWriterの第2引数にfalseを指定すると削除して新規ファイルとして書き込まれ、trueを指定すると末尾に追記していきます。
2.5バイナリファイルを書き込む
バイナリファイルを書き込むには、テキストファイルと同様「file@makeWriter(パス, 新規ならfalse、追記ならtrue)」でファイルを開いてから、writeメソッドでデータを書き込み、最後にfinメソッドでファイルを閉じます(図2-5)。
- func main()
- var handle: file@Writer :: file@makeWriter("binary_file.bin", false)
- do handle.write([0x12b8, 0x34b8, 0x56b8, 0x78b8])
- do handle.fin()
- end func
2.6テキスト、バイナリファイルのアクセス位置を操作する
テキストファイルやバイナリファイルの読み込み位置や書き込み位置を操作するには、file@Readerやfile@Writerクラスの「getPos」「setPos」メソッドを使います(図2-6)。
- func main()
- var handle: file@Reader :: file@makeReader("binary_file.bin")
- var pos: int :: handle.getPos() {アクセス位置の取得}
- do handle.setPos(%head, pos) {アクセス位置の設定}
- do handle.fin()
- end func
setPosメソッドの第1引数には、どの位置を基準にするかを指定します。 ファイルの先頭を基準に相対位置で指定する場合は「%head」、現在のアクセス位置を基準にする場合は「%cur」、ファイルの末尾を1byte超えた地点を基準にする場合は「%tail」を指定します。
3XMLファイルを読み書きする
(この記事は執筆中です!)