ファイルとフォルダのやりとり
あなたの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"
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