[C++] 73 ディレクトリ内ファイルリストの作成 C++17

[M1 Mac, Big Sur 11.6.7, clang 13.0.0]

前回はワイルドカードを使ってファイルのリストを作成しましたが、全てのファイルをリスト化する場合はdirectory_iteratorクラスなどを使います。この方法はC++17から標準で採用されています。

これについては後発学習組で助かりました。C++14以前の標準ライブラリで関数を作るのは結構手間でしょうから。

ところでBoost C++ ライブラリの現在の立ち位置が気になります。C++11以降、標準ライブラリへの採用が増えていて存在感が薄れているような。プログラミング教育や競技プログラミング界隈(一部を除く)ではまるで存在しないかのように扱われています。これは前からかな。

私自身は可読性、メンテナンス性、コンパイル速度への影響を考慮し、アプリ製作では今のところ使わない方針です。個人的にはsplit関数を早く標準に採用して欲しいところです。

#include <filesystem>
#include <string>
#include <vector>

vector<string> get_file_path(string dir) {
    vector<string> files;

    for (const std::filesystem::directory_entry& dir_entry : std::filesystem::directory_iterator(dir)) {
        if (!dir_entry.is_directory()){
            files.emplace_back(dir_entry.path().string());
        }
    }
    return files;
}

// サブディレクトリ内も再帰的に検索する場合
vector<string> get_file_path2(string dir) {
    vector<string> files;

    for (const std::filesystem::directory_entry& dir_entry : std::filesystem::recursive_directory_iterator(dir)) {
        if (!dir_entry.is_directory()){
            files.emplace_back(dir_entry.path().string());
        }
    }
    return files;
}

参考サイト

[C++] 72 パターン一致パスのリスト生成 glob.h 

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

ファイル検索アプリに新機能を追加しました。

glob.hを使って、Pythonのglob.glob()と同じようにパターン一致パスのリストを作成できるようにしました。このアプリでは*.*でディレクトリ内の全てのファイルパスをリストにします。

vector<string>をconst char*に変換するのに少し手間がかかりました。後々のために関数にしておきたいです。

またFl_Multiline_Outputが右端で折り返してくれないという仕様が発覚しましたが、ALL選択で全てコピーできるためとりあえずこれでOKとします。

#include <glob.h>

stringstream paths;

vector<string> get_file_path(string dir) {
    glob_t globbuf;
    vector<string> files;

    glob((dir + "/*.*").c_str(), 0, NULL, &globbuf);

    for (int i = 0; i < globbuf.gl_pathc; i++) {
        files.push_back(globbuf.gl_pathv[i]);
    }

    globfree(&globbuf);
    return files;
}

vector<string> files = get_file_path(string(dir_char));

for (size_t i = 0; i < files.size(); ++i) {
    if (i == 0){
        paths << "{" ;
        paths << "'" << files[i] << "'";
    } else {
        paths << ", " << "'" << files[i] << "'";
    }
}
paths << "}";
output_line->insert((paths.str()).c_str());

参考サイト

[C++] 71 FLTK : スクロールバーの配置 Fl_Scroll

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

Fl_Multiline_Outputにスクロールバーを配置しました。

コード上はまずFl_Scrollを配置して、それよりもサイズの大きいFl_Multiline_Outputを当てはめる形になります。驚くほど簡単です。

ただしこの方法では未出力状態でもスクロールバーが表示されます。Fl_ScrollとFl_Multiline_Outputを同じサイズにすればエリア外表示が発生した時点でスクロールバーが出現するのではと考えましたが、スクロールバー自体が設定できませんでした。

この点については今後の課題とし、先に進みます。

Fl_Scroll scroll(10,210,580,263);
output_line = new Fl_Multiline_Output(10,210,581,264,""); // 縦横1ピクセルだけ大きくした
output_line->textsize(12);
scroll.end();

2022/6/30追記:
type関数でスクロールバーの種類を選べることが分かりました。しかしBOTH_ALWAYS = 7だけデフォルト表示のはずがBOTH=3でも同じように表示されます。結局解決には至りませんでした。

Fl_Scroll scroll(10,210,580,263);
scroll.type(3); //BOTH
output_line = new Fl_Multiline_Output(10,210,581,264,"");
output_line->textsize(12);
scroll.end();