6.54. kink/io/FILE

ファイルシステム上のファイルを操作する。

6.54.1. FILE.open_to_read(Path ...[$config={}])

open_to_readはPathで指定されたファイルをバイト入力ストリームとして開く。結果はinput型をサポートする。

コンフィグメソッド:

• C.no_buffer / C.buffer(Max_buf_size)

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

ファイルが開けた場合、open_to_readはinputを引数として$successを末尾呼び出しする。

IOエラーが起きた場合、open_to_readはexceptionを引数として$errorを末尾呼び出しする。

バッファリング

結果のinputは、デフォルトでユーザ空間でのバッファリングを行う。

バッファサイズを制限するにはC.bufferを呼び出す。バッファのバイト長はMax_buf_sizeを超えない。

ユーザ空間でのバッファリングを行わないためには、C.no_bufferを呼び出す。

事前条件

Pathはstr値でなければならない。

Max_buf_sizeは正の整数のnum値でなければならない。

$successはinputを引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

:FILE.require_from('kink/io/')
:CONTROL.require_from('kink/')

CONTROL.with_finally{(:finally)
  :In = FILE.open_to_read('/dev/urandom')
  finally{ In.close }
  :Bin = In.read(10)
  stdout.print_line(Bin.repr)
}
# Output differs each time:
#   (bin 0xbe 0x62 0xe8 0x75 0xd4 0x88 0xd4 0xfc 0xc4 0x31)

:Result <- FILE.open_to_read('/no/such/file'){(:O)
  O.on_error{(:Exc) 'error: {}'.format(Exc.message) }
}
stdout.print_line(Result.repr)
# => "error: cannot open to read: \"/no/such/file\""

6.54.2. FILE.open_to_scan(Path Charset ...[$config={}])

open_to_scanはPathで指定されたファイルを文字入力ストリームとして開く。結果はscanner型とinput型をサポートする。

コンフィグメソッド:

• C.no_buffer / C.buffer(Max_buf_size)

• C.replace_conversion_error

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

ファイルが開けた場合、open_to_scanはscanner+inputを引数として$successを末尾呼び出しする。

IOエラーが起きた場合、open_to_scanはexceptionを引数として$errorを末尾呼び出しする。

バッファリング

結果のscanner+inputは、デフォルトでユーザ空間でのバッファリングを行う。

バッファサイズを制限するにはC.bufferを呼び出す。バッファのバイト長はMax_buf_sizeを超えない。

ユーザ空間でのバッファリングを行わないためには、C.no_bufferを呼び出す。

文字列デコード

Charsetはバイト列を文字列にデコードするために使われる。

scan_lineメソッドやscanメソッドが不正なバイト列や、Unicodeに対応しない文字を検出した場合、デフォルトではIOエラーが起きる。

C.replace_conversion_errorが呼ばれた場合、scanメソッドやscan_lineメソッドは、IOエラーの代わりに代替文字列を挿入する。

事前条件

Pathはstr値でなければならない。

Charsetはcharset値でなければならない。

Max_buf_sizeは正の整数のnum値でなければならない。

$successはscanner+inputを引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

6.54.3. FILE.open_to_write(Path ...[$config={}])

open_to_writeはPathで指定されたファイルをバイト出力ストリームとして開く。結果はoutput型をサポートする。

コンフィグメソッド:

• C.append

• C.no_buffer / C.buffer(Max_buf_size)

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

ファイルが開けた場合、open_to_writeはoutputを引数として$successを末尾呼び出しする。

IOエラーが起きた場合、open_to_writeはexceptionを引数として$errorを末尾呼び出しする。

切り詰めと新規作成

指定されたファイルが存在する場合、デフォルトでは、open_to_writeはファイルを長さゼロに切り詰める。

指定されたファイルが存在し、C.appendが呼ばれた場合、open_to_writeはファイルを切り詰めずに開く。ファイルポインタはファイルの末尾に置かれる。

指定されたファイルが存在しない場合、open_to_writeは空のファイルを新しく作る。

バッファリング

結果のoutputは、デフォルトでユーザ空間でのバッファリングを行う。

バッファサイズを制限するにはC.bufferを呼び出す。バッファのバイト長はMax_buf_sizeを超えない。

ユーザ空間でのバッファリングを行わないためには、C.no_bufferを呼び出す。

事前条件

Pathはstr値でなければならない。

Max_buf_sizeは正の整数のnum値でなければならない。

$successはoutputを引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

:FILE.require_from('kink/io/')
:CONTROL.require_from('kink/')
:CHARSET.require_from('kink/')

CONTROL.with_finally{(:finally)
  :Out = FILE.open_to_write('/dev/stdout')
  finally{ Out.close }
  Out.write(CHARSET.ascii.str_to_bin("hello\n"))
}
# => hello

6.54.4. FILE.open_to_print(Path Charset Newline ...[$config={}])

open_to_printはPathで指定されたファイルを文字出力ストリームとして開く。結果はprinter型とoutput型をサポートする。

コンフィグメソッド:

• C.append

• C.no_buffer / C.buffer(Max_buf_size)

• C.flush_on_print

• C.replace_conversion_error

• C.synchronize

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

ファイルが開けた場合、open_to_printはprinter+outputを引数として$successを末尾呼び出しする。

IOエラーが起きた場合、open_to_printはexceptionを引数として$errorを末尾呼び出しする。

Newlineはprint_lineメソッドが行区切りとして使う。

切り詰めと新規作成

指定されたファイルが存在する場合、デフォルトでは、open_to_printはファイルを長さゼロに切り詰める。

指定されたファイルが存在し、C.appendが呼ばれた場合、open_to_printはファイルを切り詰めずに開く。ファイルポインタはファイルの末尾に置かれる。

指定されたファイルが存在しない場合、open_to_printは空のファイルを新しく作る。

バッファリング

結果のprinter+outputはデフォルトでユーザ空間でのバッファリングを行う。

バッファサイズを制限するにはC.bufferを呼び出す。バッファのバイト長はMax_buf_sizeを超えない。

ユーザ空間でのバッファリングを行わないためには、C.no_bufferを呼び出す。

C.flush_on_printが呼ばれた場合、またprinter+outputがバッファされている場合、printメソッドとprint_lineメソッドが呼ばれた後ごとにprinter+outputはバッファをフラッシュする。

文字列エンコード

Charsetは文字列をバイトにエンコードするために使われる。

文字列がエンコードできない場合、デフォルトではIOエラーが起きる。

C.replace_conversion_errorが呼ばれた場合、printメソッドやprint_lineメソッドは、IOエラーの代わりに代替バイト列を挿入する。

同期化

C.synchronizeが呼ばれた場合、write, flush, print, print_line, closeのメソッドの呼び出しは単一のmutexで直列化される。

事前条件

Pathはstr値でなければならない。

Charsetはcharset値でなければならない。

Newlineはstr値でなければならない。

Max_buf_sizeは正の整数のnum値でなければならない。

$successはprinter+outputを引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

6.54.5. FILE.mkdir(Path ...[$config={}])

mkdirはPathで指定されたディレクトリを作る。

コンフィグメソッド:

• C.on_success($success): default = {}

• C.on_error($error): default = 例外を投げる関数

ディレクトリが作られた場合、mkdirは引数なしで$successを末尾呼び出しする。

IOエラーが起きた場合、mkdirはexceptionを引数として$errorを末尾呼び出しする。

事前条件

Pathはstr値でなければならない。

$successは引数なしの関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

6.54.6. FILE.rm(Path ...[$config={}])

rmはPathで指定されたファイルシステムエントリを削除する。

コンフィグメソッド:

• C.on_success($success): default = {}

• C.on_error($error): default = 例外を投げる関数

ファイルシステムエントリが削除された場合、rmは引数なしで$successを末尾呼び出しする。

IOエラーが起きた場合、rmはexceptionを引数として$errorを末尾呼び出しする。

事前条件

Pathはstr値でなければならない。

$successは引数なしの関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

6.54.7. FILE.ls(Dir_path ...[$config={}])

lsはDir_pathで指定されたディレクトリ直下のエントリを取得する。エントリのパスはDir_pathのパス部品を先頭に持つ。lsはエントリのパスのvec値を戻す。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

エントリが取得できた場合、lsはパスのvecを引数として$successを末尾呼び出しする。

IOエラーが起きた場合、lsはexceptionを引数として$errorを末尾呼び出しする。

事前条件

Dir_pathはstr値でなければならない。

$successはvecを引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

:FILE.require_from('kink/io/')

stdout.print_line(FILE.ls('/home').repr) # => ["/home/jake" "/home/elwood"]
stdout.print_line(FILE.ls('bin').repr)   # => ["bin/kinkw.exe" "bin/kink.exe" "bin/kink"]

6.54.10. FILE.realpath(Path ...[$config={}])

realpathはPath中のシンボリックリンク、..などのハードリンク、重複したパス区切りなどを解決して、絶対パスを取得する。

コンフィグメソッド:

• C.on_success($success): default = VAL.identity

• C.on_error($error): default = 例外を投げる関数

パスが解決された場合、realpathは解決されたパスのstr値を引数として$successを末尾呼び出しする。

IOエラーが起きた場合、realpathはexceptionを引数として$errorを末尾呼び出しする。

事前条件

Pathはstr値でなければならない。

$successは解決されたパスのstr値を引数に取る関数でなければならない。

$errorはexceptionを引数に取る関数でなければならない。

:FILE.require_from('kink/io/')

stdout.print_line(FILE.realpath('/usr/local/bin/..')) # => /usr/local

6.54.11. FILE.basename(Path)

basenameはPathの最後の部品にあたる、ファイルシステムエントリの名前を戻す。

Pathがそのようなエントリを持っていない場合、basenameは空のstr値を戻す。

事前条件

Pathはstr値でなければならない。

Unix系のシステムにおいて:

:FILE.require_from('kink/io/')

:base <- {(:Path)
  :Base = FILE.basename(Path)
  stdout.print_line(Base)
}
base('bin/kink') # => kink
base('/home') # => home
base('/') # =>

Windowsにおいて:

:FILE.require_from('kink/io/')

:base <- {(:Path)
  :Base = FILE.basename(Path)
  stdout.print_line(Base)
}
base('bin/kink.exe')  # => kink.exe
base('bin\kink.exe')  # => kink.exe
base('C:\Users')  # => Users
base('C:/Users')  # => Users
base('C:foo')  # => foo
base('C:\')    # =>
base('C:/')    # =>
base('C:')     # =>

6.54.12. FILE.dirname(Path)

dirnameはPathから最後の部分にあたるファイルシステムエントリの名前を取り除いたパスを戻す。

Pathがそのようなエントリを持っていない場合、dirnameはPathと意味的に同等なパスを戻す。

事前条件

Pathはstr値でなければならない。

Unix系のシステムにおいて:

:FILE.require_from('kink/io/')

:dir <- {(:Path)
  :Dir = FILE.dirname(Path)
  stdout.print_line(Dir)
}
dir('bin/kink') # => bin
dir('/home') # => /
dir('/') # => /

Windowsにおいて:

:FILE.require_from('kink/io/')

:dir <- {(:Path)
  :Dir = FILE.dirname(Path)
  stdout.print_line(Dir)
}
dir('bin/kink.exe')  # => bin
dir('bin\kink.exe')  # => bin
dir('C:\Users')  # => C:\
dir('C:/Users')  # => C:\
dir('C:foo')  # => C:
dir('C:\')    # => C:\
dir('C:/')    # => C:\
dir('C:')     # => C:

6.54.13. FILE.pwd

pwdはカレントディレクトリの絶対パスを戻す。

6.54.14. FILE.separator

separatorはホストシステムのパス区切りを戻す。

結果は "/" か "" のどちらかである。

6.54.15. FILE.file?(Path)

file?は、Pathで指定されたファイルシステムエントリが通常のファイルであると、現在のプロセスが判断できるかどうかを戻す。

6.54.16. FILE.dir?(Path)

dir?は、Pathで指定されたファイルシステムエントリがディレクトリであると、現在のプロセスが判断できるかどうかを戻す。

6.54.18. FILE.present?(Path)

present?は、Pathで指定されたファイルシステムエントリが存在すると、現在のプロセスが判断できるかどうかを戻す。