ファイル操作関数#

テキストファイル#

fopen(ファイルパス[, モード=F_READ, 追記文字列=EMPTY])#
テキストファイルを開きます

UWSCとの違い

戻り値のファイルIDが数値ではなくなりました
パラメータ:
  • ファイルパス (文字列) -- 開きたいテキストファイルのパス

  • モード (定数 省略可) --

    どのようにファイルを開くかを指定、 OR 連結可

    F_EXISTS
    パスの存在確認 (ディレクトリの場合は末尾に \ を付ける)
    戻り値が真偽値になる
    F_READ
    ファイルを読む (SJIS、UTF8、UTF16対応)
    F_WRITE
    F_READ と併記しない場合はファイルを上書きする (UTF-8)
    F_READ と併記した場合は元ファイルのエンコーディングを維持する
    F_WRITE1
    SJISで書き込む
    F_WRITE8
    UTF-8で書き込む
    F_WRITE8B
    BOM付きUTF-8で書き込む
    F_WRITE16
    UTF-16LEで書き込む
    F_APPEND
    文末に追記し、即ファイルを閉じる
    追記文字列 を必ず指定する
    F_WRITE 系と併記で書き込む文字列のエンコーディングを指定できる
    戻り値が書き込んだバイト数になる
    F_NOCR
    文末に改行を入れない
    F_TAB
    CSVセパレータをカンマではなくタブ文字にする
    F_EXCLUSIVE
    排他モードでファイルを開く
    F_AUTOCLOSE
    ファイルIDが破棄された際に自動でファイルをクローズする

    自動クローズについて

    ファイルIDオブジェクトの参照がすべて失われた場合に自動クローズ処理が実施されます
    // fopenが返すファイルIDをfputが処理した直後にファイルIDが失われるため自動クローズされhogehogeが書き込まれる
    fput(fopen("hgoe.txt", F_WRITE or F_AUTOCLOSE), "hogehoge")
    
    fid = fopen("fuga.txt", F_WRITE or F_AUTOCLOSE)
    fput(fid, "fugafuga")
    fid = EMPTY // この時点でfuga.txtが閉じられる
    
    fid = fopen("piyo.txt", F_WRITE or F_AUTOCLOSE)
    // ファイルIDのコピー
    fid2 = fid
    fput(fid, "fugafuga")
    fid = EMPTY // この時点ではまだpiyo.txtは閉じられない
    msgbox(1)
    fid2 = EMPTY // ここでpiyo.txtが閉じられる
    

  • 追記文字列 (文字列 省略可) -- F_APPEND 指定時に追記する文字列

戻り値:

モードによる

真偽値

F_EXISTS 指定時、ファイルまたはディレクトリが存在する場合はTRUE

数値

F_APPEND 指定時、書き込んだバイト数

ファイルID

F_EXISTS, F_APPEND 以外を指定した場合、開いたファイルを示すIDを返す

ファイルが開けない場合の動作について

UWSCでは-1を返していましたが、UWSCRでは実行時エラーとなりファイルが開けない理由を明確にします。
例として、以下のような状況でエラーとなります
  • F_READ のみを指定し存在しないファイルを開こうとした場合 (読み出すファイルが無いため)

  • F_WRITE が含まれていて、読み取り専用のファイルを開こうとした場合 (書き込めないため)

fget(ファイルID, [, 列=0, ダブルクォート無視=FALSE])#
ファイルを読み取ります

使用条件

F_READ を指定してファイルを開く必要があります
パラメータ:
  • ファイルID (ファイルID) -- fopen で開いたファイルのID

  • (数値) --

    読み取る行の番号、または以下の定数を指定 (定数指定時は以降の引数は無視される)

    F_LINECOUNT

    ファイルの行数を返す

    F_ALLTEXT

    ファイル全体のテキストを返す

  • (数値) -- 読み取るcsv列の番号 (1から)、0の場合は行全体

  • ダブルクォート無視 (真偽値 省略可) --

    列が1以上 (csv読み取り) の場合に有効

    TRUE
    ダブルクォートを無視する
    FALSE
    ダブルクォートで括られていたら単語と判断する
    ダブルクォートはダブルクォートでエスケープする ("")

戻り値:

読み取った文字列
該当行または列が存在しない場合は EMPTY

EMPTYについて

UWSCでは指定行および列が存在しない場合に空文字("")を返していましたが、UWSCRでは EMPTY を返すように変更しています
これにより空文字を読み取った場合と、不正な行や列を読み取った場合を区別できるようになりました

サンプルコード

test.csv
foo,bar,baz
foo   ,    bar   ,  baz
"ダブルクォートありのカラム","ダブルクォートの""エスケープ""",""
スクリプト
fid = fopen("test.csv", F_READ)

print fget(fid, 1) // foo,bar,baz
print fget(fid, 1, 1) // foo
// 前後のホワイトスペースはトリムされる
print fget(fid, 2, 1) // 「    foo   」にはならず「foo」が返る
// ダブルクォートで括られたカラム
print fget(fid, 3, 1, FALSE) // ダブルクォートありのカラム
print fget(fid, 3, 1, TRUE)  // "ダブルクォートありのカラム"
// 第4引数FALSEはUWSCにおける 2 の動作が標準になりました
print fget(fid, 3, 2, FALSE) // ダブルクォートの"エスケープ"
print fget(fid, 3, 2, TRUE)  // "ダブルクォートの""エスケープ"""

fclose(fid)
fput(ファイルID, [, 行=0, 列=0])#
ファイルに書き込みます

使用条件

F_WRITE 系を指定してファイルを開く必要があります
パラメータ:
  • ファイルID (ファイルID) -- fopen で開いたファイルのID

  • (文字列) -- 書き込む文字列

  • (数値 省略可) --

    書き込む行を指定

    0

    文末に新たな行として書き加えます

    1以上

    指定行に書き込みます (上書き)

    F_ALLTEXT (定数)

    ファイル全体を書き込む値で上書きします

  • (数値 省略可) --

    書き込むCSV列を指定

    0

    行全体に書き込み

    1以上

    CSVカラムとして書き込み

    F_INSERT (定数)
    指定した行へ上書きではなく挿入します
    F_READ が未指定の場合無視されます

戻り値:

なし

fdelline(ファイルID, )#
指定行を削除します

使用条件

F_READ および F_WRITE 系を指定してファイルを開く必要があります
パラメータ:
  • ファイルID (ファイルID) -- fopen で開いたファイルのID

  • (数値) -- 削除する行の番号 (1から)、該当行がない場合なにもしない

戻り値:

なし

fclose(ファイルID[, エラー抑止=FALSE])#
ファイルを閉じて変更を適用します

ファイルの更新について

ファイルを閉じない限り fputfdelline による変更はファイルに反映されません
パラメータ:
  • ファイルID (ファイルID) -- fopen で開いたファイルのID

  • エラー抑止 (真偽値 省略可) -- TRUEにするとファイル書き込み時のエラーを無視する

戻り値:

ファイルへの書き込みが行われ正常に閉じられた場合はTRUE

サンプルコード

// 読み取り
fid = fopen(path) // fopen(path, F_READ) と同等
print fget(fid, 1)
fclose(fid)

// 書き込み
fid = fopen(path, F_WRITE)
fput(fid, text)
fclose(fid) // 上書きされる

// 読み書き
fid = fopen(path, F_READ or F_WRITE)
print fget(fid, 1)
fput(fid, text)
fclose(fid) // 編集して保存

// エンコーディングを変更して保存
fid = fopen(path, F_WRITE1) // SJISでファイルを書き込み
fput(fid, text1)
fclose(fid)

fid = fopen(path, F_READ or F_WRITE16)
fput(fid, text2)
fclose(fid) // 編集してUTF-16で保存

// 追記
fopen(path, F_APPEND or F_WRITE16, text) // UTF-16で末尾に追記
fopen(path, F_APPEND) // エラー; F_APPEND指定時は第三引数が必須

// 自動ファイルクローズ
print fput(fopen(path, F_WRITE or F_AUTOCLOSE), "auto close")
// F_AUTOCLOSEによりfput実行後にファイルが自動でクローズされる

iniファイル#

readini([セクション=EMPTY, キー=EMPTY, ファイル="<#GET_UWSC_NAME>.ini"])#
iniファイルを読み込みます
パラメータ:
  • セクション (文字列 省略可) -- 読み出したいキーのあるセクション名を指定、省略時はセクション一覧を得る

  • キー (文字列 省略可) -- 値を読み出したいキーの名前を指定、省略時はキー一覧を得る

  • ファイル (文字列またはファイルID 省略可) --

    読み出すiniファイルのパス、またはファイルID

    ファイルIDを利用する場合

    F_READ を含めてfopenしている必要があります

戻り値:

セクション省略時
iniファイルのセクション一覧を格納した配列
セクション省略時のキー指定は無視されます
キーを省略

指定セクションのキー一覧を格納した配列

セクションとキーを指定
該当キーの値
該当キーが存在しない場合EMPTY

サンプルコード

test.ini

[section]
key1="あ"
key2="い"
key3="う"
[foo]
name="foo"
[bar]
name="bar"
[baz]
name="baz"

スクリプト

ini = 'test.ini'
print readini('foo', 'name', ini) // foo

// セクションを省略(またはEMPTY指定)するとセクション一覧を取得
print readini( , , ini) // [ section, foo, bar, baz ]
print readini( , 'name', ini) // ↑と同じ結果 (セクション省略時のキーは無視される)

// セクションを指定してキーを省略(またはEMPTY指定)するとキー一覧を収録
print readini('section', , ini) // [ key1, key2, key3 ]
writeini(セクション, キー, [, ファイル="<#GET_UWSC_NAME>.ini"])#
iniファイルに書き込みます
パラメータ:
  • セクション (文字列) -- 書き込みたいキーのあるセクション名、存在しない場合新規に作成されます

  • キー (文字列) -- 書き込みたいキーの名前、存在しない場合新規に作成されます

  • (文字列) -- 該当キーに書き込む値

  • ファイル (文字列またはファイルID 省略可) --

    書き込むiniファイルのパス、またはファイルID

    ファイルIDを利用する場合

    ファイルIDは F_READ 及び F_WRITE 系を含めてfopenしている必要があります
    また、ファイルIDを渡した場合はfcloseを呼ぶまで変更が反映されません

戻り値:

なし

deleteini(セクション[, キー=EMPTY, ファイル="<#GET_UWSC_NAME>.ini"])#
指定キーまたはセクションを削除します
パラメータ:
  • セクション (文字列) -- 削除したいキーのあるセクション名

  • キー (文字列) -- 削除したいキーの名前

  • ファイル (文字列またはファイルID 省略可) --

    書き込むiniファイルのパス、またはファイルID

    ファイルIDを利用する場合

    ファイルIDは F_READ 及び F_WRITE 系を含めてfopenしている必要があります
    また、ファイルIDを渡した場合はfcloseを呼ぶまで変更が反映されません

戻り値:

なし

INI関数のファイルID利用について#

iniファイルをfopenで開き、そのファイルIDを各種ini関数に渡すことでiniファイルの読み書きができるようになりました

サンプルコード

fid = fopen("hoge.ini", F_READ or F_WRITE)
// ファイルパスの代わりにファイルIDを指定
print readini("hoge", "fuga", fid)        // 読む場合はF_READが必要
writeini("hoge", "fuga", "fugafuga", fid) // 書き込みにはF_READ or F_WRITEが必要
deleteini("hoge", "fuga", fid)            // 削除にもF_READ or F_WRITEが必要

fclose(fid) // iniファイルへの書き込みが反映される
以下のような用途を想定しています
  • 同一iniファイルへの複数回の読み書きを行う場合にファイルアクセスを減らしたい

  • iniファイル編集時に排他制御(F_EXCLUSIVE)したい

その他のファイル操作#

deletefile(ファイルパス)#
ファイルを削除します
*, ? によるワイルドカード指定も可能
パラメータ:

ファイルパス (文字列) -- 削除したいファイルのパス

戻り値:

該当ファイルすべてを削除できた場合TRUE、一つでも該当ファイルが削除できなかった場合は該当ファイルが存在しない場合はFALSE

ワイルドカード指定時の動作について

UWSCではワイルドカード指定時に削除できないファイルが含まれていたとしても別のファイルが一つでも削除できればTRUEを返していましたが、UWSCRでは一つでも削除できないファイルが含まれていればFALSEを返します
getdir(ディレクトリパス[, フィルタ="*", 非表示ファイル=FALSE, 取得順=ORDERBY_NAME])#
対象ディレクトリに含まれるファイル、またはディレクトリの一覧を取得します
パラメータ:
  • ディレクトリパス (文字列) -- 対象ディレクトリのパス

  • フィルタ (文字列 省略可) --

    ファイル名のフィルタ、ワイルドカード(*, ?)可
    \ のみ、または \ から始まる文字列指定でファイルではなくディレクトリ一覧を返す

  • 非表示ファイル (真偽値 省略可) -- 非表示ファイルを含めるかどうか

  • 取得順 (定数 省略可) --

    取得順を示す定数

    ORDERBY_NAME

    ファイル名順

    ORDERBY_SIZE

    サイズ順

    ORDERBY_CREATED

    作成日時順

    ORDERBY_MODIFIED

    更新日時順

    ORDERBY_ACCESSED

    最終アクセス日時順

戻り値:

該当するファイル名またはディレクトリ名の一覧を格納した配列

UWSCとの違い

該当ファイルの個数ではなく配列が返るようになりました
それに伴い特殊変数 GETDIR_FILES は廃止されました

サンプルコード

ファイル構成
C:\test\
├ foo1.txt
├ foo2.txt
├ bar.txt
├ baz.txt
├ hidden.txt (隠しファイル)
├ dir1\
├ dir2\
├ folder1\
└ folder2\
スクリプト
// ファイル一覧の表示
print getdir('C:\test') // [foo1.txt, foo2.txt, bar.txt, baz.txt]
// ファイル名のフィルタ
print getdir('C:\test', 'foo*') // [foo1.txt, foo2.txt]
// 隠しファイルも表示
print getdir('C:\test', , TRUE) // [foo1.txt, foo2.txt, bar.txt, baz.txt, hidden.txt]
// フォルダ一覧の表示
print getdir('C:\test', '\') // [dir1, dir2, folder1, folder2]
// フォルダ一名のフィルタ
print getdir('C:\test', '\dir*') // [dir1, dir2]
dropfile(ID, ディレクトリ, ファイル名[, ファイル名...])#
ファイルをウィンドウにドロップします
ドロップ位置はクライアント領域の中央です
パラメータ:
  • ID (数値) -- ファイルをドロップするウィンドウのID

  • ディレクトリ (数値) -- ドロップするファイルの存在するディレクトリパス

  • ファイル名 (文字列または配列) -- ファイル名を示す文字列、またはファイル名を示す文字列を含む配列変数

戻り値:

なし

dropfile(ID, x, y, ディレクトリ, ファイル名[, ファイル名...])
第二、第三引数が数値だった場合はファイルのドロップ座標を指定します
対象ウィンドウのクライアント座標を指定します
パラメータ:
  • x (数値) -- クライアントX座標

  • y (数値) -- クライアントY座標

ファイル名指定数の下限および上限

上限は座標未指定時は34、座標指定時は32個まで (すべての引数の個数上限が36)
ファイル数がそれより多い場合は配列変数を使ってください
下限は1です (最低1つ指定する必要がある)

マウス移動が行われます

ドロップ処理時に瞬間的にマウスカーソルを指定座標に移動しています
(UWSCと同様の処理)

実行要件

対象ウィンドウが WM_DROPFILES メッセージを処理できる必要があります

ZIPファイル#

zip(zipファイル, ファイル[, ファイル, ...])#
zipファイルを作成します
パラメータ:
  • zipファイル (文字列) -- 作成するzipファイルのパス

  • ファイル (文字列または配列) --

    zipファイルに含めたいファイルのパス (10個まで)
    パスの配列を渡すこともできる

    格納されるファイルのパス構成について

    指定したパスがファイルの場合はそのファイル名でzipに格納します
    フォルダが指定された場合はそのフォルダ以下のすべてのファイルをフォルダからの相対パスでzipに格納します

戻り値:

成功時TRUE

サンプルコード

files = [
    'foo.uws',
    'bar.uws',
    'baz.uws',
    'modules', // フォルダ指定
]

zip("test.zip", files)
unzip(zipファイル, 展開先フォルダ)#
zipファイルを指定フォルダに展開します
展開先フォルダが存在しない場合は新規に作成されます
すでに同名ファイルが存在する場合は上書きされます
パラメータ:
  • zipファイル (文字列) -- 展開したいzipファイルのパス

  • 展開先フォルダ (文字列) -- 展開先フォルダのパス

戻り値:

成功時TRUE

ヒント

失敗した場合でも一部のファイルが展開されることがあります

サンプルコード

unzip("test.zip", "out")

for file in getdir("out")
    print file
next
for dir in getdir('out', '\')
    for file in getdir("out\<#dir>")
        print "<#dir>/<#file>"
    next
next
// foo.uws
// bar.uws
// baz.uws
// modules\qux.uws
// modules\quux.uws
zipitems(zipファイル)#
zipファイルに含まれるファイル一覧を取得します
パラメータ:

zipファイル (文字列) -- zipファイルのパス

戻り値:

ファイル名を格納した配列 (フォルダの区切りは /)

サンプルコード

for item in zipitems("test.zip")
    print item
next
// foo.uws
// bar.uws
// baz.uws
// modules\qux.uws
// modules\quux.uws