## WriteFile / WriteFileIf / WriteFileStart / WriteFileEnd

`WriteFile` (clip, string filename, string expression1, ... , string expression16, bool "append", bool "flush")
`WriteFileIf` (clip, string filename, string expression1, ... , string expression16, bool "append", bool "flush")
`WriteFileStart` (clip, string filename, string expression1, ... , string expression16, bool "append")
`WriteFileEnd` (clip, string filename, string expression1, ... , string expression16, bool "append")

`WriteFile` は、expressionN*1 を評価して、その結果を文字列に変換し、ファイルに書き出します。

「ランタイム」変数*2の current_frame は、「式（expression）」の中で使えるように設定されます
（これは、ScriptClip の場合と同じように動作します。詳しい情報はヘルプで確認してください）。
current_frame は、スクリプトが読み込まれるときに -1 に設定され、スクリプトがクローズされるときに -2 に設定されます。

`WriteFile` はフレームごとに出力を生成し、 `WriteFileIf` は最初の式が `true`（真）の場合にのみ出力を生成します。スクリプトのオープン時またはクローズ時の出力はありません。
`WriteFileStart` と `WriteFileEnd` は、スクリプトのオープン時とクローズ時にのみ出力を生成し、フレームごとのアクションはありません。

append = `true` のとき、結果は既存のファイルに追加されます。
flush = `true` のとき、ファイルは毎回実行後にクローズされ、再オープンされます。そのため、結果をすぐに見ることができます（遅くなるかもしれません）。
`WriteFileStart` と `WriteFileEnd` では、 flush はつねに `true` です。
append のデフォルトは、 `WriteFileStart` （デフォルト `false`） を除き、つねに `true` です。

#### いくつかの簡単な例を使って最もうまく説明することができます:

    filename = "c:\myprojects\output.txt"
    # フレームを取得するためにテスト用のビデオを作成する
    Version()

    # 式は変数のみで、この変数は評価されファイルに書き出される
    # 各行にフレーム番号の書かれたファイルが得られる
    WriteFile(filename, "current_frame")

    # この行はスクリプトがオープンされたときに書き込まれる
    WriteFileStart(filename, """ "This is the header" """)

    # こちらはスクリプトがクローズされるときに書き込まれる
    WriteFileEnd(filename, """ "Now the script was closed" """)

どうすればトリプルクォート*3を使って文字列の中に文字列をタイプすることができるのか確かめてください！

式が評価できない場合は、代わりにエラーメッセージが書き込まれます。
`WriteFileIf` の if 式でこれが起こると、結果は `true` であると仮定されます。

    # 「I don't know what "this" means」*4という結果に終わる
    WriteFile(filename, "this is nonsense")

#### ファイル内に数字を書き込むより簡単な方法があります。しかし ...

この例では、「ランタイム関数」を FrameEvaluate と一緒に使用する方法を見ることができます。

    # 異なるフレームを取得するためにテスト用のビデオを作成する
    Version.FadeIn(50).ConvertToYV12

    # フレーム番号、「:」（コロン）、および、そのフレームの輝度の平均値を書き込む
    WriteFile("F:\text.log", "current_frame", "colon", "AverageLuma")

あるいは、実時間も出力したいと思うかもしれません:

    # 異なるフレームを取得するためにテスト用のビデオを作成する
    Version.FadeIn(50).ConvertToYV12

    # フレーム番号、現在の時間、および、そのフレームの輝度の平均値を書き込む
    # 文字列の内側に引用符を入れるためにトリプルクォートが必要
    WriteFile(last, filename, "current_frame", """ time(" %H:%M:%S") """, "AverageLuma")

#### その他の使用例:

`WriteFileIf` では、1 番最初の式はブーリアン*5（true または false）であることが期待されています。
それが TRUE である場合にのみ、その他の式が評価され、その行が書き込まれます。
（覚えておいて下さい: && は「かつ」、|| は「または」、== は「等しい」、!= は「等しくない」です。）
そのようにファイルから完全に行を省くことができます。

    # 異なるフレームを取得するためにテスト用のビデオを作成する
    Version.FadeIn(50).ConvertToYV12

    # AverageLuma が 30 から 60 までのフレームのみ、フレーム番号を書き込む
    WriteFileIf(last, filename, "(AverageLuma>30) && (AverageLuma<60)", "current_frame", """ ":" """, "AverageLuma")

`原文 Date: 2004/07/04 19:37:46`
`日本語訳 $Date: 2008/07/19 03:50:17 $`

- 訳者註:
  - *1 WriteFile の 第 3 引数以降の string 型の引数のこと。expression は式の意。N には 1 から 16 までの数字が入る。
  - *2 ランタイムは「実行時」の意。フィルタの実行時にフレームごとに評価され、値が代入される特別な変数。同じくフレームごとに結果を返すランタイム関数もある。詳しくは、ConditionalFilter を参照。
  - *3 二重引用符（"）を 3 つ続けて重ねた文字列（"""）のこと。
  - *4 日本語に直訳すると、「『this』が何を意味するのかわかりません」という意味。
  - *5 true （真）または false （偽）のいずれかの値のみを返す式のこと。参考: ブーリアンとは 【boolean】　─　意味・解説 ： IT用語辞典 e-Words