HOWTO · MATLAB

MATLAB でのファイルの存在の確認

ディレクトリにファイルが存在するかどうかは、MATLAB の exist() および dir() 関数を使用して確認できます。

このページの内容

ファイルの有無だけを調べるなら exist() を、該当項目の詳細も確認するなら dir() を使います。MATLAB が検索する場所を指定したい場合は、ファイル名またはパスを明示してください。以下の例では、それぞれ一時ファイルを作成し、MATLAB 互換の構文を使います。どちらも Octave で実行したもので、表示される出力は MATLAB ではなく Octave のものです。

MATLAB で exist() 関数を使ってファイルの有無を確認する

exist() はファイルやフォルダーを調べられますが、検索タイプを指定しない名前は、ワークスペース変数や関数など、別の MATLAB 項目に一致することもあります。ファイルだけを調べるには検索タイプに 'file' を指定します。戻り値 2 は該当するファイルがあることを示します。フォルダーを調べるには 'dir' を指定し、戻り値 7 は該当するフォルダーがあることを示します。戻り値 0 は、指定した種類の項目が見つからなかったことを意味します。MATLAB は相対名を現在のフォルダーと検索パスを基準に解決します。特定の場所を指定するには絶対パスを使ってください。詳しくは MathWorks の exist リファレンスと関数の優先順位を参照してください。

次の例ではファイルを作成し、その完全なパスを調べます。ファイル種別コードを表示します。exist() の仕様では、作成したファイルに対する値は 2 です。Octave で実行した際の出力は次のとおりです。

root = tempname();
mkdir(root);
filePath = fullfile(root, 'report.txt');
fid = fopen(filePath, 'w');
fprintf(fid, 'Monthly report\n');
fclose(fid);

fileType = exist(filePath, 'file');
fprintf('File type: %d\n', fileType);

delete(filePath);
rmdir(root);
File type: 2

検索タイプに 'file' を指定すると、同じ名前の変数やフォルダーを目的のファイルと取り違えずに済みます。フォルダーを調べるには、代わりに exist(folderPath, 'dir') を呼び出します。古いコマンド形式の exist name はコマンドプロンプトで手早く使えます。一方、関数形式ならスクリプト内で結果を保存して比較できます。

MATLAB で dir() 関数を使ってファイルの有無を確認する

該当項目の詳細も確認したい場合は、dir() を使います。dir() は構造体配列を返し、各項目には name、folder、date、bytes、isdir などのフィールドが含まれることがあります。フィールドの構成は MATLAB のリリースによって異なる場合があるため、固定のフィールド数を前提にしないでください。isempty(matches) でパターンに一致する項目があるかを調べられます。ファイルに一致した場合、matches(1).bytes からバイト数を取得できます。フォルダーが返された場合はディレクトリー項目であり、一定サイズの一覧ではありません。フォルダーのパスに対して dir() を呼び出すと中身が一覧表示されることがあるため、フォルダーとファイルを区別するときは isdir を確認してください。相対パスは MATLAB の現在のフォルダーを基準にします。対象を明確にするには完全なパスを使ってください。詳しくは MathWorks の dir リファレンスを参照してください。

次の別の例ではファイルを作成し、そのパスを指定して dir() を呼び出し、返された名前とサイズを表示します。Octave で実行した際の出力は次のとおりです。

root = tempname();
mkdir(root);
filePath = fullfile(root, 'animal.jpg');
fid = fopen(filePath, 'w');
fprintf(fid, 'image data');
fclose(fid);

matches = dir(filePath);
if isempty(matches)
    fprintf('No match\n');
else
    fprintf('Name: %s\n', matches(1).name);
    fprintf('Bytes: %d\n', matches(1).bytes);
end

delete(filePath);
rmdir(root);
Name: animal.jpg
Bytes: 10

有無だけを確認するなら exist(path, 'file') のほうが簡潔です。項目の詳細やワイルドカードによる一覧が必要な場合は dir() を選び、フォルダー一覧の大きさだけで一致の有無を判断せず、返された構造体配列を使って確認してください。