asyncfile

このモジュールは非同期によるファイル読み書き機能の実装です。

import asyncfile, asyncdispatch, os

proc main() {.async.} =
  var file = openAsync(getTempDir() / "foobar.txt", fmReadWrite)
  await file.write("test")
  file.setFilePos(0)
  let data = await file.readAll()
  doAssert data == "test"
  file.close()

waitFor main()

AsyncFile = ref object
  fd: AsyncFD
  offset: int64
  ソース 編集

プロシージャ

proc getFileSize(f: AsyncFile): int64 {...}{.raises: [OSError], tags: [].}
指定されたファイルのサイズを取得します。  ソース 編集
proc newAsyncFile(fd: AsyncFD): AsyncFile {...}{.raises: [Exception, OSError],
                                        tags: [RootEffect].}
以前に開いたファイルディスクリプタ fdAsyncFile を作成します。  ソース 編集
proc openAsync(filename: string; mode = fmRead): AsyncFile {...}{.
    raises: [OSError, Exception], tags: [RootEffect].}
ファイルモード (FileMode) mode で指定されたパスにある filename のファイルを非同期で開きます。  ソース 編集
proc readBuffer(f: AsyncFile; buf: pointer; size: int): Future[int] {...}{.
    raises: [ValueError, FutureError, Exception], tags: [RootEffect].}

ファイルポインタの現在位置を始点として指定されたファイルから size バイトを非同期で読み取ります。

ファイルポインタがファイル終端を超えたならば 0 を返し、バイトを buf へ読み込みません。

  ソース 編集
proc read(f: AsyncFile; size: int): Future[string] {...}{.
    raises: [ValueError, FutureError, Exception], tags: [RootEffect].}

ファイルポインタの現在位置を始点として指定されたファイルから size バイトを非同期で読み取ります。

ファイルポインタがファイル終端を超えたならば空文字列を返します。

  ソース 編集
proc readLine(f: AsyncFile): Future[string] {...}{.
    raises: [Exception, ValueError, FutureError], tags: [RootEffect].}
指定されたファイルから一行を非同期で読み取ります。  ソース 編集
proc getFilePos(f: AsyncFile): int64 {...}{.raises: [], tags: [].}
指定されたファイルの読み取りで使われるファイルポインタの現在位置を取得します。ファイルの先頭バイト位置はインデックス 0 です。  ソース 編集
proc setFilePos(f: AsyncFile; pos: int64) {...}{.raises: [], tags: [].}
読み書き処理で使われるファイルポインタの位置を設定します。ファイルの先頭バイト位置はインデックス 0 です。  ソース 編集
proc readAll(f: AsyncFile): Future[string] {...}{.
    raises: [Exception, ValueError, FutureError], tags: [RootEffect].}
指定されたファイルにあるデータをすべて読み取ります。  ソース 編集
proc writeBuffer(f: AsyncFile; buf: pointer; size: int): Future[void] {...}{.
    raises: [FutureError, Exception], tags: [RootEffect].}

buf から size バイトを指定されたファイルへ非同期で書き込みます。

指定されたファイルへの全データ一括書き込み完了後に Future が返されます。

  ソース 編集
proc write(f: AsyncFile; data: string): Future[void] {...}{.
    raises: [FutureError, Exception], tags: [RootEffect].}

指定されたファイルに data を非同期で書き込みます。

指定されたファイルへの全データ一括書き込み完了後に Future が返されます。

  ソース 編集
proc setFileSize(f: AsyncFile; length: int64) {...}{.raises: [OSError], tags: [].}
ファイルの長さを設定します。  ソース 編集
proc close(f: AsyncFile) {...}{.raises: [Exception, OSError], tags: [RootEffect].}
指定されたファイルを閉じます。  ソース 編集
proc writeFromStream(f: AsyncFile; fs: FutureStream[string]): owned(Future[void]) {...}{.
    raises: [Exception, FutureError], tags: [RootEffect].}

読み終えるまで指定された Future ストリームからデータを読み取ります。読み取られたデータは直ちにファイルへ書き込みを行い、メモリから削除されます。

このプロシージャはメモリを無駄にせずにストリーム形式のデータをファイルへ保存するのに理想的です。

  ソース 編集
proc readToStream(f: AsyncFile; fs: FutureStream[string]): owned(Future[void]) {...}{.
    raises: [Exception, FutureError], tags: [RootEffect].}
ファイルから読み取りを行い、指定された Future ストリームへデータを書き込みます。  ソース 編集