Scilabでファイルの検索を再帰的に行う関数


はじめに

Scilabにはファイルの検索を行う関数findfilesが標準ライブラリの中に存在しますが、再帰的な検索を行うことができません。パッと見た限り、再帰的に探す方法が出てこなかったので、自分で書いてみました。

実装

ただのファイル検索ですし、ファイル名と一致するかどうかは関数findfilesに任せることができますから、仕組みとしては簡単です。関数の再帰呼び出しは好きではないので、列ベクトルを用いて実装しました。

function [files] = findfilesRecursively(path, filespec)
    // [files] = findfilesRecursively([path, [filespec]])
    //
    // 説明:
    // 関数 findfilesRecursively はファイルを再帰的に検索します。
    //
    // 出力:
    // - files: 合致するファイルのフルパスが格納された行列
    //
    // 入力:
    // - path: 検索を行うパス
    // - filespec: 検索を行うファイル名

    [lhs, rhs] = argn(0);
    if rhs < 1 then
        path = pwd();
    end
    if rhs < 2 then
        filespec = "*.*";
    end

    files = [];
    dirs = [path];
    while size(dirs, 'r') > 0 do
        maskedFiles = findfiles(dirs(1), filespec);
        if size(maskedFiles, 'r') > 0 then
            files = [files; dirs(1) + '\' + maskedFiles];
        end

        allFiles = findfiles(dirs(1));
        if size(allFiles, 'r') then
            for allFile = (dirs(1) + '\' + allFiles)' do
                if isdir(allFile) then
                    dirs = [dirs; allFile];
                end
            end
        end

        dirs = dirs(2:$);
    end
endfunction

さいごに

Scilabにまだまだ慣れていないため、関数lengthを使いそうになったり、行ベクトルと列ベクトルを間違えそうになったりして、いい勉強になりました。
この記事で示したコードはパブリックドメイン、つまりご自由に使っていただいて大丈夫です。ただし、一切の責任を取りかねますのでご了承ください。