ファイル操作関数#
テキストファイル#
- 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の場合は行全体
ダブルクォート無視 (真偽値または2 省略可) --
列が1以上 (csv読み取り) の場合に有効
- FALSE
- 両端のダブルクォートを削除する
- TRUE
- 両端にダブルクォートがあってもなにもしない
- 2
- 連続するダブルクォート (
""
) を単一のダブルクォート ("
) にするその後両端のダブルクォートを削除する (FALSEと同じ処理)
- 戻り値:
- 読み取った文字列該当行または列が存在しない場合は
EMPTY
EMPTYについて
UWSCでは指定行および列が存在しない場合に空文字(""
)を返していましたが、UWSCRではEMPTY
を返すように変更していますこれにより空文字を読み取った場合と、不正な行や列を読み取った場合を区別できるようになりました
サンプルコード
test.csvfoo,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])#
- ファイルを閉じて変更を適用します
ファイルの更新について
ファイルを閉じない限りfput
やfdelline
による変更はファイルに反映されません- パラメータ:
ファイル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実行後にファイルが自動でクローズされる
CSVファイル#
- csvopen(CSVパス[, ヘッダ有無=FALSE, TSVモード=FALSE])#
- CSVファイルを開く
- パラメータ:
CSVパス (文字列) -- CSVファイルのパス
ヘッダ有無 (真偽値 省略可) -- 対象CSVファイルにヘッダ行があるかどうか
TSVモード (真偽値または文字 省略可) -- FALSEの場合はカンマ区切り、TRUEにするとタブ文字区切り、または任意のASCII文字
- 戻り値の型:
CSVオブジェクト
- 戻り値:
CSVファイルを示すオブジェクト、各種csv関数で利用される
- csvclose(csv)#
- 編集したCSVをファイルに書き出すバッファに変更があった場合のみ対象ファイルに書き込みを行う
csvopen
で指定したファイルが存在しない場合は新しいファイルが作成されるこの関数呼び出し後のCSVオブジェクトに対して再度この関数を実行しても書き込みは行われない自動クローズ
CSVオブジェクトが破棄された場合は自動でこの関数と同等の処理が行われます(fopen
のF_AUTOCLOSE
指定時と同様です)クローズ後のCSVオブジェクトについて
バッファに対する読み書きはできますが、再度csvclose
で書き込みを行うことはできません- パラメータ:
csv (CSVオブジェクト) --
csvopen
の戻り値- 戻り値:
なし
- csvread(csv[, 行, 列])#
- CSVバッファから値を読み出します
- パラメータ:
csv (CSVオブジェクト) --
csvopen
の戻り値行 (数値 省略可) -- CSVの行番号
列 (数値または文字列 省略可) -- CSVの列番号、またはヘッダのカラム名
- 戻り値の型:
文字列または配列
- 戻り値:
行列の指定方法により得られる値が変わります
行
列
値
省略
省略
CSV全体の文字列
省略
1以上
該当列の配列
0
省略
ヘッダ行の配列
1以上
省略
該当行の配列
1以上
1以上
該当行及び列の文字列
サンプルコード
test.csv#項目1,項目2,項目3 1,2,3 10,20,30 100,200,300
// ヘッダ行を有効にして開く csv = csvopen("test.csv", true) // CSV全体を得る print csvread(csv) // 項目1,項目2,項目3 // 1,2,3 // 10,20,30 // 100,200,300 // ヘッダ行の配列を得る print csvread(csv, 0) // [項目1, 項目2, 項目3] // 2行目の配列を得る print csvread(csv, 2) // [10, 20, 30] // 2行目1列目の文字列を得る print csvread(csv, 2, 1) // 10 // 1列目の配列を得る print csvread(csv, , 1) // [1, 10, 100] // 列をカラム名で指定 print csvread(csv, 3, "項目2") // 200 print csvread(csv, , "項目3") // [3, 30, 300]
- csvwrite(csv, 行, 列, 値)#
- CSVバッファに書き込みを行う
- パラメータ:
csv (CSVオブジェクト) --
csvopen
の戻り値行 (数値) -- CSVの行番号
列 (数値または文字列) -- CSVの列番号、またはヘッダのカラム名
値 (文字列または配列) -- 書き込む値
- 戻り値の型:
真偽値
- 戻り値:
書き込み時true
サンプルコード
new_csv = "new.csv" deletefile(new_csv) // ファイルを新規作成 csv = csvopen(new_csv, true) // 0行目指定でヘッダを書き込む csvwrite(csv, 0, 1, "項目1") csvwrite(csv, 0, 2, "項目2") csvwrite(csv, 0, 3, "項目3") // 指定位置に書き込み csvwrite(csv, 1, 1, "1-1") // 配列指定で複数列書き込み csvwrite(csv, 2, 1, ["2-1", "2-2", "2-3"]) // 3行目を飛ばして4行目に書き込み csvwrite(csv, 4, 1, ["4-1", "4-2", "4-3"]) // 2列目から書き込み csvwrite(csv, 5, 2, ["5-2", "5-3"]) // 列の数は可変 csvwrite(csv, 6, 1, ["6-1", "6-2", "6-3", "6-4", "6-5"]) // 全体読み出し print csvread(csv) // 項目1,項目2,項目3 // 1-1 // 2-1,2-2,2-3 // "" // 4-1,4-2,4-3 // ,5-2,5-3 // 6-1,6-2,6-3,6-4,6-5 csvclose(csv) // 保存 // 書き出したファイルも確認 print fget(fopen(new_csv, F_READ or F_AUTOCLOSE), F_ALLTEXT) // 項目1,項目2,項目3 // 1-1 // 2-1,2-2,2-3 // "" // 4-1,4-2,4-3 // ,5-2,5-3 // 6-1,6-2,6-3,6-4,6-5
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利用について#
サンプルコード
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