位置指定IO読み書きメソッド追加拡張ライブラリ
- Package name: ioposrw
- Version: 0.4
- Production quality: TECHNICAL PREVIEW, METASTABLE
- License: BSD-2-clause License
- Author: dearblue (mailto:dearblue@users.noreply.github.com)
- Project Page: https://github.com/dearblue/ruby-ioposrw
- QUICK REFERENCE
- HISTORY (In Japanese)
ioposrw は IO インスタンスに位置指定読み書き機能を追加する拡張ライブラリです。
この機能は IO#readat
/ IO#writeat
によって提供されます。
これらのメソッドは、元々ある IO#read
/ IO#write
によって更新されるファイル位置ポインタに影響されません。
マルチスレッド動作中に同じファイルインスタンスの別の領域を読み書きしても、想定通りの動作が期待できます。
追加の機能として、StringIO#readat
/ StringIO#writeat
も実装してあります (実際に利用する場合は、require "ioposrw/stringio"
を行って下さい)。
ライブラリの読み込み:
require "ioposrw"
ファイルの読み込み:
File.open("sample.txt") do |file|
buf = ""
file.readat(200, 100, buf) # sample.txt の先頭 200 バイト位置から
# 100 バイトを buf に読み込む
end
ファイルの書き込み:
File.open("sample.txt", "w") do |file|
buf = "ごにょごにょ"
file.writeat(200, buf) # sample.txt の先頭 200 バイト位置に buf を書き込む
end
-
Windows 上では、
IO#readat / IO#writeat
を呼び出すとファイルポインタ (IO#pos) が指定位置の次に変更されます (このことは丁度IO#pos=
とIO#read
を呼び出した後の状態と考えてください)。これは Windows 自身に伴う仕様となります。
POSIX システムコールの pread(2)
/ pwrite(2)
を中心に実装しました。
Windows 環境では OVERRAPPED
構造体を与えた ReadFile
/ WriteFile
をそれぞれ用いて pread
/ pwrite
関数を構築し、あとは同じです。