ファイルとフォルダのやりとり
あなたのSenseTalkスクリプトは、様々な方法でファイルやファイルシステムオブジェクトとやりとりすることができます。たとえば、ローカルマシンのファイルから保存されたデータを読み取り、そのデータを使用して追加のアクションを実行することができます。ほとんどの場合、下記のAccessing a File as a Containerで説明されている最初の方法を使用してファイルを読み書きすることをお勧めします。
SenseTalkのファイルやファイルシステムオブジェクトを操作するコマンドや関数は、テスト対象のシステム(SUT)ではなく、ローカルマシン上で動作します。
ファイルやファイルシステムの情報にアクセスしたい場合は、File and Folder Referencesを参照してください。
ベストプラクティスとして、SenseTalkスクリプト内で参照される任意のファイルは、スイートウィ ンドウのリソースペインを通じてEggplant Functionalに追加する必要があります。この方法では、ファイルが指定されたスイートのスイートディレクトリ内のリソースディレクトリに保存されます。SenseTalkはローカルファイルシステム上の他の場所に保存されたファイルにアクセスすることもできますが、リソースディレクトリを使用すると追加の機能が提供されます。詳細はResources Paneを参照してください。
コンテナとしてのファイルへのアクセス
ファイルの内容を操作する最も簡単な方法は、SenseTalkコンテナとして直接ファイルにアクセスすることです。このアプローチを使用すると、単一のコマンドでファイル全体を読むことができます:
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
はエラーメッセージに設定されます。ファイルが存在しないかアクセスできない場合に、ファイルをコンテナとして読み込むときにthe result
の値もエラーメッセージに設定されます。この場合、ファイル式の値は空として扱われます。
put file "/nonExistent/File" into contents
put the result --> File not found: /nonExistent/File
put contents is empty --> True
コマンドが何らかの理由でファイルに書き込みに失敗した場合(例えば、ファイルに書き込む権限が不足している場合)、the result
はエラーメッセージに設定されます。
ファイルをコンテナとして扱うことは簡単で、多くの状況でうまく機能します。しかし、スクリプトがファイルで大量の読み書きを必要とする場合、それは最も効率的なアプローチではないかもしれません。このような場合、ファイル操作のコマンドと関数で説明されているコマンドを使用することを好むかもしれません。
ファイルの動作の設定
SenseTalkコマンドが新しいファイルを作成するとき、ディレクトリ構造内で作成される任意のフォルダへのアクセスと同様に、ファイルのアクセス許可を制御できます。これらのプロパティの読み取りや設定についての完全な詳細については、The Umask
グローバルプロパティを参照してください。
put file "/tmp/datafile"as dataintomyData
putcontentsas dataintofile "/tmp/binaryFile"
ファイルをコンテナとしてアクセスする際、テキストは読み書きの両方でthe defaultStringEncoding
グローバルプロパティの設定に従って解釈されます。デフォルトでは、SenseTalkはUTF-8、Unicode文字をエンコードする一般的な8ビットシステムを使用します。テキストとしてではなく、バイナリデータとしてファイルを読み書きするには、as data
を指定します:
The StrictFiles
グローバルプロパティを使用して、コンテナとして存在しないファイルを読み取る際の動作を制御できます。デフォルトはfalseで、存在しないファイルは空として扱われます。ファイルが存在しない場合に例外をスローしたい場合、このプロパティをtrueに設定します。
ファイル操作のコマンドと関数
ファイル入出力コマンド(open file
、close file
、read from file
、seek in file
、write to file
)は、システム上のテキストファイルやバイナリファイルを作成しアクセスするためのものです。それらを使用して、ファイルシステムに格納されているデータを読み書きします。
これらのコマンドを使用するだけでなく、スクリプト内でコンテナとして直接ファイルにアクセスすることもできます。上記で説明したように、ファイルをコンテナとしてアクセスすることは、その内容を読み取るか操作する最も単純な方法を提供しますが、同じファイルに対して複数の操作を行う場合、ここで説明するコマンドよりも制御力が少なく、効率が少し落ちます。
Open File
コマンド
パラメーター: 開くか作成するファイルの名前。
動作: ファイルを開くまたは作成して、読み取り、書き込み、または両方を行います。open file
コマンドは、read
または write
コマンドを使ってファイルから何かを読み取るか、そのファイルに書き込む前に、ファイルを開くために使わなければなりません。ファイルを終了したら、close file
コマンドまたは close all
コマンドのいずれかを使用してファイルを閉じるべきです。
構文:
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
コマンド
振る舞い: close file
コマンドは、open file
コマンドで開かれた開いているファイルを閉じます。 close all files
コマンドは、open file
コマンドで開かれたすべての開いているファイルを閉じます。スクリプトがファイルへのアクセスを終えたら close file
コマンドを使用するか、現在開いているすべてのファイルを閉じるために close all files
コマンドを使用します。
SenseTalkはスクリプトの実行が停止するたびに自動的にすべての開いているファイルを閉じますが、スクリプトがファイルの作業を終えたらファイルを閉じるようにすることが良い習慣です。
パラメータ: close file
では、閉じるファイルの名前が必要です。 close all files
コマンドはパラメータを取りません。
Syntax:
close file fileName
close all { files }
_fileName_は閉じるファイルの名前を与える表現であるべきです。ファイル名は、ファイルの完全なパス名であるか、または現在の作業フォルダ(the folder
によって返される)に対して相対的に指定されるべきです。
例:
close file "/etc/passwd"
例:
close all files -- open filesコマンドで開いたすべての開いているファイルを閉じます
close all files
コマンドは、現在開いているすべてのファイルを閉じます。これはどのスクリプトやハンドラがファイルを開いたかに関係なく行われます。この動作は、他のスクリプトがファイルを開いてまだ使用している場合、問題を引き起こす可能性があります。 openFiles()
関数を使用して、開いているすべてのファイルのリストを取得することができます。
The Umask:
ファイル内の現在位置
関数
動作: 開いているファイル内で次に読み書きされるバイトの位置を取得します。位置1はファイルの始まりを表します。
文法:
{the} {current} [position | location | offset] in file filename
例:
get the current position in file myFile
ファイルから読み取る
コマンド
動作: ファイルから読み取る
コマンドを使用してファイルからデータを読み取ります。なお、ファイルはまずファイルを開く
コマンドで開く必要があります。データは変数it
に読み込まれるか、指定された目的のコンテナに読み込まれます(into
節を使用)。
ファイルから読み取る
コマンドは、指定した数の文字、単語、アイテム、行、またはバイトを読み取ることができます。指定した区切り文字が見つかるまで読み取ることもできます。また、いくつかの異なるタイプの数値のリストを読み取 ることもできます。読み取りは現在の位置から始まります。または、at
節を使用して開始位置を指定します。
データがこれ以上読み取り可能でないとき、目的のコンテナは空になります。要求されたデータが読み取られない場合、result
関数には理由(time out
や、ファイルの終わりに到達した場合はeof
など)が格納されます。
パラメーター: 以前にファイルを開く
コマンドで開いたファイルの名前。ファイルは、読み取りを許可するモードで開かれている必要があります(つまり、書き込みのみが許可されているwriting
モードではありません)。
文法:
read Options
数量オプション: オプション。一度に一つだけ使用できます。
from file fileName
他のオプション: オプション。一度に複数使用できます。
until [ {the} eof | {the} end {of {the} file} | terminator ]
for quantity {dataType}
[a | an | quantity] dataType
{for} {a | an} http {message | request | response}
{for} {a | an} [xmlrpc | xml-rpc] {message | request | response}
ソースオプション: 必須。
at startPos
[ in | [timeout | time out] {after | in} ] timeoutDuration
into container
もし until terminator (または他のバリエーション)が指定されている場合、指定された文字または文字列の次の出現までの開始位置からすべての文字が読み取られます。このオプションは、ソースから1行ずつ読み取る (終了文字として return
を使用する)ため、または他の区切り文字 (たとえば tab
) が見つかるまで読み取るために便利です。終端記号は長さが1文字以上になることがあり、読み取った値の一部として返されます。until eof
または until end
を指定すると、ファイルの終わりまで読み取ります。
もし for quantity dataType が使われている場合、quantity によって指定され た文字数または他のデータ要素がファイルから読み取られます。もし dataType がテキストチャンクタイプ (つまり、characters
, words
, items
, または lines
) であれば、要求された量が利用可能になるまでテキストが読み取られます。最終的な区切り文字 (もしあれば) は、読み取られたテキストには含まれません。もし dataType が指定されていない場合、bytes
が想定されます (この場合、for
の単語は必須です)。
at
startpos を使用して、ファイルから読み取る
コマンドが読み取りを開始するファイル内のバイト位置を指定します。もし startpos の値が負の数であれば、読み取りが始まるファイルの終端からのバイト数を指定します。startpos の値が指定されていない場合、最初に読み取られる文字またはバイトは、そのファイルで最も最近のread
、write
、またはseek
コマンドによって決定されるファイル内の現在の位置にあります。
もし into container が指定されていれば、読み取られたデータは指定されたコンテナに入れられます。into
オプションが指定されていない場合、データは特別なit
変数に読み込まれます。
テキストチャンクタイプの代わりに数値データタイプを指定した場合、読み込みによって it
または container に格納される値は、読み込まれたデータ値のリストとなります。以下の数値データタイプが使用できます:
データタイプ | 値 |
---|---|
int1 または 8-bit integer | 8ビット(または1バイト)の符号付き整数 |
uint1 または unsigned 8-bit integer | 8ビット(または1バイト)の符号なし整数 |
int2 または 16-bit integer または short integer | 16ビット(または2バイト)の符号付き整数 |
uint2 または unsigned 16-bit integer | 16ビット(または2バイト)の符号なし整数 |
int4 または 32-bit integer または integer | 32ビット(または4バイト)の符号付き整数 |
uint4 または unsigned 32-bit integer | 32ビット(または4バイト)の符号なし整数 |
int8 または 64-bit integer | 64ビット(または8バイト)の符号付き整数 |
uint8 または unsigned 64-bit integer | 64ビット(または8バイト)の符号なし整数 |
real4 または 32-bit real または float | 32ビット (単精度) 浮動小数点数 |
real8 または 64-bit real または double | 64ビット (倍精度) 浮動小数点数 |
例:
read from file myFile for 20 -- 次の20バイトを読み込む
例:
read from file myFile into myFileVar until return
-- 最初の行を読み込み、変数に格納する
例:
read 100 characters from file xyz into input -- 次の100文字を入力に読み込む
例:
read into inQueue 5 items from file dataFile at 100
-- 位置 100 (100番目のバイト) から始まり、5つのテキスト項目を読み込み、
-- それらを変数 inQueue に格納する