0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UWSCRAdvent Calendar 2023

Day 20

UWSCRの組み込み関数:ファイル操作系

Last updated at Posted at 2023-12-19

ファイル操作系組み込み関数の変更点および新規に追加された関数の解説です。

変更

fopen

fopenの戻り値が数値ではなくなりました。代わりにファイルIDオブジェクトを返します。

以下のような記述はできなくなりました。

fopen("hoge.txt")
fget(1, 1)

F_APPENDの追加

F_APPENDを指定するとテキストファイルの末尾に追記を行います。この場合第三引数に書き込みたい文字列を渡します。

fopen("hoge.txt", F_APPEND, "書き込む文字列")

ファイルIDオブジェクト消失時のファイルクローズ

ファイルIDを保持する変数がなくなった場合、そのファイルは自動でクローズされます。

fid = fopen("fopen.txt", F_WRITE)
fput(fid, "てすと")
fid = EMPTY // この時点でファイルがクローズされ変更が反映される

これにより以下のような記述が可能になりました。

fput(fopen("fopen.txt", F_WRITE), "べこべこ")
// 1. 第一引数評価時にファイルを開きファイルIDを返す
// 2. fputが対象ファイルに書き込みを行う
// 3. fput実行後にファイルIDが保持されていないため自動クローズされる

また、fcloseの呼び忘れなどでファイルをクローズしていなくてもスクリプト終了時にも自動クローズされます。

ファイルIDオブジェクトのデストラクタ(のようなもの)でファイルクローズ処理を行っています。

iniファイル関連

ファイルIDによるiniファイルの読み書き

iniファイル操作系関数にファイル名を渡す代わりにファイルIDを渡すことができるようになりました。

inifile = "test.ini"

// ファイル名を指定した場合は都度ファイルをオープン/クローズする
writeini("filename", "foo", 1, inifile)

// iniファイルをfopenする
// 排他制御もできる
fid = fopen(inifile, F_WRITE or F_READ or F_EXCLUSIVE)

writeini("fid", "foo", 1, fid)
writeini("fid", "bar", 2, fid)
writeini("fid", "baz", 3, fid)

// fclose時に変更を反映
fclose(fid)
  • readiniにはF_READが必要です
  • writeiniにはF_WRITEが必要です
    • 追記の場合はF_WRITE or F_READにします
  • deleteiniにはF_WRITE or F_READが必要です

readiniによるセクションおよびキー一覧の取得

iniファイルのセクション一覧およびセクション内のキー一覧を取得できるようになりました。
readiniの第一引数(セクション名)を省略すると対象iniファイルのセクション一覧を配列で返します。セクション名を指定し第二引数(キー名)を省略すると対象セクションのキー名一覧を配列で返します。

test.ini
[hoge]
foo=1
bar=2
baz=3
[fuga]
foo=1
[piyo]
bar=2
inifile = "test.ini"

// セクション名省略でセクション一覧を得る
print readini(, , inifile)
// [hoge, fuga, piyo]

// キー名省略でキー一覧を得る
print readini("hoge", , inifile)
// [foo, bar, baz]

getdir

破壊的変更があります。

関数の戻り値が取得されたファイル名の配列となり、それに伴いGETDIR_FILES特殊配列変数は廃止されました。

新規

zipファイル

zipファイルを扱えるようになりました。

パスワード付きzipファイルは未対応です。

zip

作成するzipファイル名とzipに含めたいファイルパスを指定し、zip圧縮します。

// 3つのファイルをzipファイルに圧縮する
zip('test.zip', 'foo.txt', 'bar.txt', 'baz.txt')

files = [
    'qux.txt',
    'quux.txt',
    'corge.txt'
]
// 配列も可
zip('test2.zip', files)

unzip

zipファイルを任意のフォルダに展開します。展開先フォルダが存在しない場合は新規に作成されます。

unzip('test.zip', 'test')
for file in getdir('test')
    print file
next
// foo.txt
// bar.txt
// baz.txt

zipitems

zipファイルに含まれるファイル一覧を得ます。

for file in zipitems("test2.zip")
    print file
next
// qux.txt
// quux.txt
// corge.txt
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?