ファイルとフォルダのやりとり
あなたのSenseTalkスクリプトは、様々な方法でファイルやファイルシステムオブジェクトとやりとりすることができます。たとえば、ローカルマシンのファイルから保存されたデータを読み取り、そのデータを使用して追加のアクションを実行することができます。ほとんどの場合、下記のAccessing a File as a Containerで説明されている最初の方法を使用してファイルを読み書きすることをお勧めします。
SenseTalkのファイルやファイルシステムオブジェクトを操作するコマンドや関数は、テスト対象のシステム(SUT)ではなく、ローカルマシン上で動作します。
ファイルやファイルシステムの情報にアクセスしたい場合は、File and Folder Referencesを参照してください。
ベストプラクティスとして、SenseTalkスクリプト内で参照される任意のファイルは、スイートウィンドウのリソースペインを通じてEggplant Functionalに追加する必要があります。この方法では、ファイルが指定されたスイートのスイートディレクトリ内のリソースディレクトリに保存されます。SenseTalkはローカルファイルシステム上の他の場所に保存されたファイルにアクセスすることもできますが、リソースディレクトリを使用すると追加の機能が提供されます。詳細はResources Paneを参照してください。
コンテナとしてのファイルへのアクセス
ファイルの内容を扱う最も簡単な方法は、file式を使用してファイルを直接SenseTalkのコンテナと してアクセスすることです。このアプローチを使うと、1つのコマンドでファイル全体を読み取ることができます:
put file "/etc/passwd" into passwordInfo
同様に簡単にファイルを書き込むこともできます:
put "0,0,0,0" into file "/tmp/testing/counters"
上記のコマンドは、ディレクトリ/tmp/testing内にcountersという名前のファイルを作成し、その中に値0,0,0,0を書き込みます。/tmp/testingディレクトリが存在しない場合、それも作成されます。既に/tmp/testing/countersというファイルが存在する場合、その前の内容は新しい値で完全に置き換えられるので、この方法を使用するときは注意が必要です。
ファイル内のテキストの任意の部分にアクセスするために、チャンク式を使用することもできます:
add 1 to item 2 of line 1 of file "/tmp/testing/counters"
このコマンドは、ファイルの現在の内容を読み取り、最初の行の2番目のアイテムに1を追加し、変更された値をファイルに戻します。
以下の例は、この方法を使用してファイル全体を一行ずつ読む方法を示しています:
put file "/Users/bob/Desktop/TestRead"intoMyFileVar
put line repeatindex() of MyFileVar into output
log output
end repeat
この例では、各行を読み取った後にログを出力 するだけですが、代わりにコンテンツを操作するための追加のコードを追加することもできます。ここでは、その内容がoutputという変数に格納されます。
ファイルをコンテナとして読む際、ファイルが存在しないかアクセスできない場合、the result の値はエラーメッセージに設定されます。この場合、ファイル式の値は空として扱われます。以下の例に示す通りです:
put file "/nonExistent/File" into contents
put the result --> File not found: /nonExistent/File
put contents is empty --> True
コマンドが何らかの理由でファイルに書き込みに失敗した場合(例えば、ファイルに書き込む権限が不足している場合)、the resultはエラーメッセージに設定されます。
ファイルをコンテナとして扱うことは簡単で、多くの状況でうまく機能します。しかし、スクリプトがファイルで大量の読み書きを必要とする場合、それは最も効率的なアプローチではないかもしれません。このような場合、ファイル操作のコマンドと関数で説明されているコマンドを使用することを好むかもしれません。
ファイルの動作の設定
ファイルにコンテナとしてアクセスする際、テキストは読み取りと書き込みの両方でdefaultStringEncodingグローバルプロパティの設定に従って解釈されます。デフォルトでは、SenseTalkはUnicode文字をエンコードする一般的な8ビットシステムであるUTF-8を使用します。テキストとしてではなくバイナリデータとしてファイルを読み書きするには、as dataを指定します:
put file "/tmp/datafile"as dataintomyData
putcontentsas dataintofile "/tmp/binaryFile"
SenseTalk コマンドが新しいファイルを作成すると、そのファイルへのアクセス許可と、ディレクトリ構造内に作成されたフォルダーへのアクセスを制御できます。これらのプロパティの読み取りまたは設定の詳細については、Umask グローバル プロパティ を参照してください。
The StrictFiles グローバルプロパティを使用して、コンテナとして存在しないファイルを読み取る際の動作を制御できます。デフォルトはfalseで、存在しないファイルは空として扱われます。ファイルが存在しない場合に例外をスローしたい場合、このプロパティをtrueに設定します。
ファイル操作のコマンドと関数
ファイル入出力コマンド(open file、close file、read from file、seek in file、write to file)は、システム上のテキスト ファイルやバイナリファイルを作成しアクセスするためのものです。それらを使用して、ファイルシステムに格納されているデータを読み書きします。
これらのコマンドを使用するだけでなく、スクリプト内でコンテナとして直接ファイルにアクセスすることもできます。上記で説明したように、ファイルをコンテナとしてアクセスすることは、その内容を読み取るか操作する最も単純な方法を提供しますが、同じファイルに対して複数の操作を行う場合、ここで説明するコマンドよりも制御力が少なく、効率が少し落ちます。
Open File コマンド
Behavior: ファイルを開くまたは作成して、読み取り、書き込み、または両方を行います。open file コマンドは、read または write コマンドを使ってファイルから何かを読み取るか、そのファイルに書き込む前に、ファイルを開くために使わなければなりません。ファイルを終了したら、close file コマンドまたは close all コマンドのいずれかを使用してファイルを閉じるべきです。
Parameters: 開くか作成するファイルの名前。
構文:
open file fileName { for [reading | writing | readwrite | appending | updating] }
fileName 式が既存のファイル名を生 成しない場合、ファイルが作成されます。fileName が絶対パスでない場合、現在の作業フォルダに対する相対パスと見なされます。
例:
open file myFile
例:
Open file "/etc/passwd" for reading
例:
put "/Users/bkwins/Desktop/testfolder1/testfile.txt" into MyFileVar
open file MyFileVar for appending
ファイルを開く際には、必要に応じてファイルがどのようにアクセスされるかを指定することができます。読み取り専用、書き込み専用、または読み取りと書き込みの両方のためにファイルを開くことができます。アクセス方法を指定しない場合、デフォルトのモードはupdatingです。
以下の表に、各モードとその違いを示します:
| モード | 読むことができる | 書き込む/作成する | 開始位置 | 既存のファイル |
|---|---|---|---|---|
Reading | はい | いいえ | 開始地点 | 変更なし |
Writing | いいえ | はい | 開始地点 | 既存のファイルを置き換える |
ReadWrite | はい | はい | 開始地点 | 最大書き込み位置以降を切り捨てる |
Appending | はい | はい | ファイルの終端 | 切り捨てられることはなく、成長する可能性がある |
Updating | はい | はい | 開始地点 | 切り捨てられることはなく、成長する可能性がある |
reading以外の全てのモードでは、存在しない場合はファイル(フルパスを含む)を作成します。
readwrite、appending、updatingの各モードは 全て、ファイルを読み取りと書き込みの両方で開きます。ただし、readwriteモードで開かれたファイルは、書き込まれたファイル内の最後(最大)の文字位置以降が切り捨てられます。ファイルに何も書き込まれていない場合、そのファイルは変更されません。
既存のファイルを開きたい場合(ただし、既に存在する場合に限ります)、次の例に示すようにfile fileName existsまたはthere is a file _fileName_を使用してファイルの存在を確認します。
例:
if there is a file myFile then
open file myFile for updating
else
answer "File " & myFile & " doesn't exist!"
exit all
end if
関連:
Close File,Close All: 開いているファイルを閉じるためにこれらのコマンドを使用します。OpenFiles: この関数を使用して、現在開いているすべてのファイルのリストを取得します。
Close File、Close All Files コマンド
Behavior: close fileコマンドは、open fileコマンドで開かれた開いているファイルを閉じます。 close all filesコマンドは、open fileコマンドで 開かれたすべての開いているファイルを閉じます。スクリプトがファイルへのアクセスを終えたら close fileコマンドを使用するか、現在開いているすべてのファイルを閉じるために close all filesコマンドを使用します。
SenseTalkはスクリプトの実行が停止するたびに自動的にすべての開いているファイルを閉じますが、スクリプトがファイルの作業を終えたらファイルを閉じるようにすることが良い習慣です。
Parameters: close fileでは、閉じるファイルの名前が必要です。 close all filesコマンドはパラメータを取りません。
構文:
close file fileName
close all { files }
_fileName_は閉じるファイルの名前を与える表現であるべきです。ファイル名は、ファイルの完全なパス名であるか、または現在の作業フォルダ(the folderによって返される)に対して相対的に指定されるべきです。
例:
close file "/etc/passwd"
例:
close all files -- open filesコマンドで開いたすべての開いているファイルを閉じます
close all filesコマンドは、現在開いているすべてのファイルを閉じます。これはどのスクリプトやハンドラがファイルを開いたかに関係なく行われます。この動作は、他のスクリプトがファイルを開いてまだ使用している場合、問題を引き起こす可能性があります。 openFiles()関数を使用して、開いているすべてのファイルのリストを取得することができます。
The Umask:
Current Position in File 関数
Behavior: 開いているファイル内で次に読み書きされるバイトの位置を取得します。位置1はファイルの始まりを表します。
文法:
{the} {current} [position | location | offset] in file filename
例:
get the current position in file myFile