ファイルとフォルダのやりとり
あなたの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 に格納する
以下に、一度に1行ずつ読み取り、処理する全体のファイルを読み取る一つの方法を示す例を示します:
例:
open file "/tmp/abcd"
repeat forever
read from file "/tmp/abcd" until returnn -- 1行を読む
if it is empty then exit repeat -- ファイルの終わりに達した
put it -- or do other processing with 'it' here
end repeat
close file"/tmp/abcd"
関連項目:
Open File Command: このコマンドを使用して指定したファイルを開きます。Write to File Command: このコマンドを使用してテキストやデータを開いているファイルに書き込みます。Close File CommandとClose All Command: これらのコマンドを使用して開いているファイルを閉じます。ソケットから読み込む、プロセスから読み込む、入力コマンドから読み込む: これらの関連コマンドは、ファイル以外のソースからの読み込みを可能にします。
Seek in File コマンド
振る舞い: 次の read または write コマンドが発生するファイル内の位置を設定します。ファイル内で read または write を実行する前に、seek コマンドを使用してファイル内の現在の位置を設定します。read と write のコマンドはどちらも at startPos オプションを提供してその操作の開始位置を指定しますが、seek コマンドは現在の位置だけでなくファイルの始めや終わりからの位置も指定できるため、追加の柔軟性を提供します。
パラメータ: open file コマンドで以前に開かれたファイルの名前。
構文:
seek in file fileName [at | to] position { from | before | after {the} [start | beginning | current position | end] }
position はファイル内で探す場所を指定する数値表現です。from オプションの一つを使用して探索の起点を指定しない場合、正の position はファイルの始めからのバイト数を示し、負の position はファイルの終わりからのバイト数を示します。数字や数値表現の代わ りに、position は the end も可能で、これは以下と同じ意味です。
from オプションを含めると、位置がファイルの始めや終わり、または現在の位置に対して相対的であることを指定できます。before や after を含めると、検索する位置を指定できます。
例:
seek in file myFile to 10 from the current position
例:
seek in file "/Users/bkwins/Documents/newText" to the end
例:
seek in file myFile to 8 bytes before the current position
関連項目:
ファイルから読む: 開いているファイルからテキストやデータを読み取るためにファイルから読み取ります。ファイルに書き込む: このコマンドを使用して、開いているファイルにテキストやデータを書き込みます。
ファイルに書き込む コマンド
振る舞い: データをファイルに書き込みます。write コマンドを使用してデータをディスク上のファイルに保存します。そのデータは後であなたのスクリプト、または他のアプリケーション全体によって再度ファイルから読み込むことができます。
パラメータ: open file コマンドで以前に開かれたファイルの名前。そのファイルは書き込みを許可するモード(つまり、読み取りのみを許可する reading モードではない)で開かれていなければなりません。
構文:
write data {as dataType} to file fileName {at [startpos | end | eof]}
data は有効な SenseTalk 式であることができます。dataType が指定されていない場合、data 式の値は文字列として扱われ、指定されたファイルに書き出されます。
もし at startpos が指定された場合、ファイルへの書き込みはそのファイル内のバイト位置から始まります。startpos の値が負の場合、それはファイルの終わりから何バイト戻って書き込みが始まるかを指定します。at end オプションまたは at eof オプションを使用すると、SenseTalk にファイルの終わり、すなわち既にファイルに存在する他のテキストの後に data を書き込むように指示します。位置が指定されていない場合、data はファイル内の現在の位置から書き込みが始まります。この位置は、そのファイルの最新の read、write、または seek コマンドによって決定されます。
もし as dataType が指定された場合、データは書き込む前にそのバイナリ形式に変換されます。この場合、data は数値のリストであることができ、すべてが同じデータタイプに変換されます。有効なデータタイプのリストについては、read from file コマンドを参照してください。
例:
write line 1 of accounts & return to file myFile
例:
write highScore & tab to file "~/.gamescores" at eof
例:
write numberList as 16-bit integers to file bData
例:
put "/Users/bob/Desktop/TestRead" into MyFileVar // creates a variable with a path to a file
open file MyFileVar // opens the file
put "GIO NOW" into MyWrite // puts a text string into a variable
write return to file MyFileVar at eof // adds a return character to the end of the file to ensure that new writes begin on a new line
write MyWrite to file MyFileVar // writes the text from the variable into the file
close file MyFileVar // closes the file
ファイルの既にデータが存在する位置に書き込むと、既存のデータが上書きされます。既存のファイルの中間にテキストを挿入するには、そのポイントからファイルの終わりまでのすべてのテキストを読み取り、それをコンテナに保存する必要があります。その後、挿入するテキストを書き出し、保存されたテキストを続けて書き出すことができます。
既存のファイルが readwrite モードまたは appending モードで開かれると、ファイルへの書き込みは、ファイルで書き込まれる最高位置を超えてデータがファイルから落ちる原因となります。このファイルの切り捨てを避けるためには、ファイルを updating モードで開く必要があります。これらのモードについての詳細は、open file コマンドを参照してください。
ファイルへのアクセスが終了したら、close file コマンドでファイルを閉じて、書き出されたすべてのデータが正しくディスクに保存されるようにする必要があります。
例:
Open File: このコマンドを使用して指定されたファイルを開きます。Read From File: このコマンドを使用して開かれたファイルからテキストまたはデータを読み込みます。Close File,Close All: これらのコマンドを使用して開いたファイルを閉じます。The DefaultStringEncoding: このグローバルプロパティは、ファイルから読み取ったり、ファイルに書き込んだりする際にテキスト文字列がどのようにエンコードされるかを指定します。
OpenFiles 関数
動作: open file コマンドの結果として現在開いているファイルのリストを返します。
パラメータ: なし。
Syntax:
the openFiles
openFiles()
例:
log the openFiles
例:
open file "/Users/bkwins/Documents/newText"
put openFiles() into myVar
log myVar
特定の開いているファイルだけにアクションを実行するために openFiles() を使用することができます。例えば、以下の例では、関数から返される情報を使用して、名前が .dat で終わるすべての開いているファイルを閉じる方法を示しています。
例:
repeat with each item of the openFiles
if it ends with ".dat" then close file it
end repeat
関連項目:
Open File: このコマンドを使用して指定されたファイルを開きます。Close File,Close All: これらのコマンドを使用して開いたファイルを閉じます。
ファイルシステムと連携するためのコマンドと関数
いくつかのコマンドと関数は、スクリプトが実行されているマシン(またはローカルにマウントされたファイルシステム)上のファイルシステムへのアクセスを提供し、スクリプトがファイルやフォルダを作成、移動、コピー、名前変更、削除することを可能にし、システム内のファイルとフォルダに関する情報を取得することができます。
Create File, Create Folder, Create Link コマンド
動作: ファイルシステムに新しいファイルやフォルダ、または既存のファイルやフォルダへのシンボリックリンクを作成します。create folder コマンドを使用してディスクに新しいフォルダを作成します。create file コマンドを使用して空のファイルを作成します。create link を使用して、独立したファイルのように見えるリンク(エイリアスやシンボリックリンクとも呼ばれます)を作成しますが、実際にはディスク上の別のファイルへの参照です。
存在しないファイルに対して open file コマンドを使用するか、存在しないファイルに何かを put コマンドを使用して入れることでもファイルを作成することができます。どちらの方法も、指定されたディレクトリ構造とともにファイルを作成します。
パラメータ: create file および create folder には、作成するファイルまたはフォルダの名前が必要です。create linkには、リンクの名前と、リンク先のファイルまたはフォルダの名前が必要です。
構文:
create {a} {new} [file | folder | directory] fileOrFolderName {with properties}
create {a} {new} link linkName to [file | folder | directory] fileOrFolderName
fileOrFolderName 式は、絶対パス名または現在のフォルダに対する相対パス名を生成する必要があります。作成されるファイル、フォルダ、またはリンクは既に存在していないものでなければなりません。親フォルダが存在しない場合は、それも作成されます。
with properties オプションを使用する場合、properties は、次のプロパティのいずれかに対する初期値を指定するプロパティリストでなければなりません:ownerName, groupName, permissions, creationDate, modificationDate, そしてファイルの場合:typeCode, creatorCode, fileExtensionHidden, appendOnly, もしくは locked。これらのプロパティを設定する方法については、Accessing File Properties を参照してください。
例:
create file "/tmp/myWorkArea/testData"
例:
create a new folder "/tmp/myWorkArea"
例:
create folder "/tmp/myWorkArea/subdir" with {groupName:"admin", permissions:"rwxrwxr-x"}
例:
create link "tasty" to file "juicy"
the throwExceptionResults グローバルプロパティをfalseに設定すると、このコマンドが例外をスローするのを防ぎ、そのエラーが result() 関数を通じて利用可能になります。
Delete File, Delete Folder コマンド
振る舞い: ディスクからファイルまたはフォルダを永久に削除します。deleteコマンドを使用してファイルを破壊するか、フォルダとそのすべての内容を破壊します。このコマンドは恒久的で不可逆的ですので、注意して使用してください。
パラメータ: 削除するファイルまたはフォルダの名前。
構文:
delete [file | folder | directory] fileOrFolderName
fileOrFolderName 式は、既存のファイルまたはフォルダの名前を生成する必要があります。フォルダを削除すると、その中のすべてのファイルとフォルダも 削除されます。
例:
delete file "testData27"
例:
delete folder "/tmp/myWorkArea"
the throwExceptionResults グローバルプロパティをfalseに設定すると、このコマンドが例外をスローするのを防ぎ、そのエラーが result() 関数を通じて利用可能になります。
Rename File, Rename Folder コマンド
振る舞い: rename コマンドを使用して、ファイルまたはフォルダの名前を変更します。
パラメータ: 名前を変更したいファイルの名前と、そのファイルの新しい名前。
構文:
rename [file | folder | directory] originalName as newName
originalName 式は、既存のファイルまたはフォルダの名前を生成する必要があります。newName が完全なパス名でない場合、それはソースファイルまたはフォルダが存在するフォルダに対する相対パスとみなされます。
例:
rename folder "/tmp/myWorkArea" as "oldWorkArea"
例:
rename file sourceFile as sourceFile && "backup"
the throwExceptionResults グローバルプロパティをfalseに設定すると、このコマンドが例外をスローするのを防ぎ、そのエラーが result() 関数を通じて利用可能になります。