Kuina-chan

くいなちゃん2018年10月19日


プログラミング言語Kuin」の逆引き辞典7、ファイルを読み書きする方法についてです。

ファイルやディレクトリを操作する

テキスト、バイナリファイルを読み書きする

XMLファイルを読み書きする

目次

ファイルやディレクトリを操作する

Kuinではファイルパスの区切り文字には「\」は使わず「/」を使い、ディレクトリパスを表すときには終端に「/」を付けます。 つまり「"a\b\c"」とは書かずに、「"a/b/c/"」と書きます。
Kuinの標準ライブラリの関数の引数は、編集対象を先に指定する順番で統一しています。 このため、コピー関数の引数は「コピー先, コピー元」の順になりますのでご注意ください。

ファイルやディレクトリをコピーする

ファイルをコピーするには「file@copyFile(コピー先パス, コピー元パス)」とし、ディレクトリをコピーするには「file@copyDir(コピー先パス, コピー元パス)」とします(ファイルやディレクトリのコピー)。
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」関数は中身のサブディレクトリやファイルも一緒にコピーされます。

ファイルやディレクトリを移動する

(この記事は執筆中です!)

ファイルやディレクトリを削除する

ファイルを削除するには「file@delFile(パス)」とし、ディレクトリを削除するには「file@delDir(パス)」とします(ファイルやディレクトリの削除)。
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」関数は中身のサブディレクトリやファイルも一緒に削除されます。

ディレクトリを作成する

ディレクトリを作成するには「file@makeDir(パス)」とします(ディレクトリの作成)。
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」の中身のサブディレクトリやファイルはすべて削除されます。

ファイルやディレクトリの存在を確認する

ファイルやディレクトリが存在しているかどうかを取得するには「file@exist(パス)」とします(ファイルやディレクトリの存在の取得)。
func main()
  var b: bool
  do b :: file@exist("dst_dir/dst_file.txt")
  do b :: file@exist("dst_dir/")
end func
ファイルやディレクトリの存在の取得
存在していれば「true」、していなければ「false」が返ります。

ファイルのサイズを取得する

ファイルのサイズを取得するには「file@fileSize(パス)」とします(ファイルサイズの取得)。
func main()
  var size: int :: file@fileSize("dst_dir/dst_file.txt")
end func
ファイルサイズの取得
戻り値の単位はbyteです。

ディレクトリ内のファイルを列挙する

(この記事は執筆中です!)

パスの一部を抜き出す

ファイルパスから、ディレクトリ部分を抜き出すには「file@dir」を使い、拡張子を除いた部分を抜き出すには「file@delExt」を使い、拡張子を抜き出すには「file@ext」を使い、ファイル名を抜き出すには「file@fileName」を使います(パスの整形)。
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
パスの整形

自身の実行ファイルのディレクトリパスを取得する

自身の実行ファイルファイル(.exe)が存在するディレクトリパスを取得するには「file@exeDir()」とします(実行ファイルのディレクトリの取得)。
func main()
  var path: []char :: file@exeDir()
end func
実行ファイルのディレクトリの取得

特殊なディレクトリのパスを取得する

デスクトップなどの特殊なディレクトリのパスを取得するには「file@sysDir(特殊なディレクトリの種類)」とします(特殊なディレクトリパスの取得)。
func main()
  var s: []char
  do s :: file@sysDir(%appData) {アプリケーションデータ}
  do s :: file@sysDir(%desktop) {デスクトップ}
  do s :: file@sysDir(%fonts) {フォント}
  do s :: file@sysDir(%programFiles) {ProgramFiles}
  do s :: file@sysDir(%system32) {System32}
  do s :: file@sysDir(%windows) {Windowsディレクトリ}
end func
特殊なディレクトリパスの取得

テキスト、バイナリファイルを読み書きする

テキストファイルを読み込む

テキストファイルを読み込むには、「file@makeReader(パス)」でファイルを開いてから、各種メソッドでデータを読み込み、最後にfinメソッドでファイルを閉じます(テキストファイルの読み込み)。
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」メソッドは区切り文字を無視して読み込みます。

バイナリファイルを読み込む

バイナリファイルを読み込むには、テキストファイルと同様「file@makeReader(パス)」でファイルを開いてから、readメソッドでデータを読み込み、最後にfinメソッドでファイルを閉じます(バイナリファイルの読み込み)。
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
バイナリファイルの読み込み

テキスト、バイナリファイルの終端を判定する

テキストファイルやバイナリファイルの読み込み時に終端を判定するには、file@Readerクラスの「term」メソッドを使います(テキスト、バイナリファイルの終端判定)。
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を返します。

テキストファイルを書き込む

テキストファイルを書き込むには、「file@makeWriter(パス, 新規ならfalse、追記ならtrue)」でファイルを開いてから、各種メソッドでデータを書き込み、最後にfinメソッドでファイルを閉じます(テキストファイルの書き込み)。
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を指定すると末尾に追記していきます。

バイナリファイルを書き込む

バイナリファイルを書き込むには、テキストファイルと同様「file@makeWriter(パス, 新規ならfalse、追記ならtrue)」でファイルを開いてから、writeメソッドでデータを書き込み、最後にfinメソッドでファイルを閉じます(バイナリファイルの書き込み)。
func main()
  var handle: file@Writer :: file@makeWriter("binary_file.bin", false)
  do handle.write([0x12b8, 0x34b8, 0x56b8, 0x78b8])
  do handle.fin()
end func
バイナリファイルの書き込み

テキスト、バイナリファイルのアクセス位置を操作する

テキストファイルやバイナリファイルの読み込み位置や書き込み位置を操作するには、file@Readerやfile@Writerクラスの「getPos」「setPos」メソッドを使います(テキスト、バイナリファイルのアクセス位置の操作)。
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」を指定します。

XMLファイルを読み書きする

(この記事は執筆中です!)
1539956623jaf