Tera Termマクロでファイルの存在を確認する方法
マクロ実行時にファイルが存在するのか確認したい場合があります。今回はファイルが存在するのかマクロで確認する方法を解説します。
ファイルステータスを取得するコマンド
filestatはTera Term 4.66以降で使用できるコマンドです。このコマンドは、ファイルのサイズや最終変更時刻、ドライブ番号を取得します。
使い方は次のようになります。
filestat <filename> <size> [<mtime>] [<drive>]
filenameにステータスを取得したいファイル名、sizeはファイルサイズが格納される変数です。mtimeとdriveは指定しなくても大丈夫です。
このコマンドは、ァイルステータスの取得に失敗するとシステム変数resultに「-1」が格納されます。 マクロでファイルの存在確認をするサンプルコードは次のとおりです。
;ファイルの存在を確認するサンプル
; 存在確認するファイル
filename = 'hoge.txt'
size = 0
filestat filename size
if result == -1 then
messagebox 'ファイルが存在しない' size
else
messagebox 'ファイルが存在する' size
endif
もしもディレクトリだったら?
filestatはファイルでなくディレクトであった場合でもシステム変数resultは「-1」にならず、ファイルが存在するときと同様に「0」が格納されます。
ファイルとディレクトリを一発で判別する正しい方法
ファイルとディレクトリを判別するにはgetfileattrを使います。
name = "C:\test"
getfileattr name
if result < 0 then
messagebox "not found" name
elseif result & $10 then
messagebox "directory" name
else
messagebox "file" name
endif
getfileattrはTera Term 4.69以降で使うことができるTTLコマンドで、次のように使います。
getfileattr <filename>
これでfilenameで指定したファイルの属性を取得します。
属性の取得に失敗した場合はシステム変数resultに「-1」が格納されます。成功すると、属性値がシステム変数resultへ格納されます。
※属性値の頭に「$」が付いているのは16進数という意味です。
$1 … 読み取り専用
$2 … 隠しファイルまたは隠しディレクトリ
$4 … オペレーティングシステムの一部、またはオペレーティングシステム専用
$10 … ディレクトリ
$20 … アーカイブ
$80 … 特に属性はない
$100 … 一時ファイル
$200 … スパースファイル
$400 … 再解析ポイントが関連付けられているか、シンボリックリンク
$800 … 圧縮されている
$1000 … オフラインの記憶装置へ物理的に移動された(Windows 2000 以降)
$2000 … インデックスサービスの対象になっていない(Windows 2000 以降)
$4000 … 暗号化されている
これらの属性値を使ってファイル属性を判別します。さきほどのサンプルコードで属性値を次のように判別していました。
elseif result & $10 then
この「&」はビット演算子です。ビット演算子はTera Term 4.53以降で使うことができます。
ファイルは複数の属性を持つ場合があるため「==」で比較するのではなくビット演算子でフラグが立っているのか確認しています。
たとえば読み取り専用か知りたければ「result & $1」で調べる事ができます。
この記事が気に入ったらサポートをしてみませんか?