ファイルの存在

概要

C++17ではファイルの存在チェックが様変わりしています。
ファイルの存在チェックはエディタ用のプログラムでは頻出することでしょう。

可変長引数

  • C++側のソース

    FileCheck.dllとしてコンパイル
    #include <windows.h>
    #include <string>
    #include <vector>
    #include <fstream>
    #include <filesystem>
    
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    
    extern "C" __declspec(dllexport) THmNumber test() {
        Hm.funcDllExport();
    
        try {
            // 現在編集中のパス
            filesystem::path openfile = Hm.Edit.getFilePath();
            
            if (filesystem::exists(openfile)) {
                Hm.OutputPane.output(L"ファイルは存在します\r\n");
            }
            else {
                Hm.OutputPane.output(L"ファイルは存在しません\r\n");
            }
    
            filesystem::path test = filesystem::path("C:") / "aaa" / "bbb.txt";
            if (filesystem::exists(test)) {
                wstring filename = test.filename();
                Hm.OutputPane.output(filename + L"は存在します\r\n");
            }
            else {
                wstring filename = test.filename();
                Hm.OutputPane.output(filename + L"は存在しません\r\n");
            }
    
        }
        catch (exception& e) {
            // エラー内容をchar → wstring へ
            auto wide_what = Text::Encoding::cp932_to_utf16( e.what() );
            Hm.OutputPane.output(wide_what + L"\r\n");
        }
    
    
        return 1;
    }
    
  • 秀丸マクロ側のソース

    test.mac
    // FileCheck.dllとしてコンパイルした
    #dll = loaddll(currentmacrodirectory + @"\FileCheck.dll");
     
    // 途中でマクロの文法や型の致命的エラーが発生した場合でもdllを解放する。
    if (version >= 898) { eval "keepdll #dll, 0"; }
     
    #r = dllfuncw(#dll, "test");
     
    freedll(#dll);