【C++】 ファイルが存在するか確認する関数

ファイルの存在を確認することは,プログラムでファイルを操作する際によく行われる処理です.C++では,C++17以降のバージョンで導入されたstd::filesystemライブラリを利用することで,簡単かつ効率的にファイルの存在をチェックできます.

ファイルが存在するか確認する方法は多岐にわたりますが,この記事では,C++17より前と以降での方法をそれぞれ紹介します.

目次

ファイルの存在確認をする関数

C++17より前

C++17より前ではこのstat関数を用いてファイルの存在確認を行います.

stat関数は,ファイルの属性を調べるために使われる関数です.Linux/Unixシステム用の関数なので,Windowsで使用する場合は注意が必要です.


#include <sys/types.h>
#include <sys/stat.h>

bool IsFileExist(const std::string& name) {
    struct stat buffer;
    return (stat(name.c_str(), &buffer) == 0 && S_ISREG(buffer.st_mode));
}

C++17以降

C++17以降はstd::filesystemライブラリのstd::filesystem::is_regular_file()を使用すると非常に簡単です.また,LinuxでもWindowsでも使用できます.

std::filesystem::is_regular_file()は,指定されたファイルが存在しかつ通常のファイル(シンボリックリンクを含まない)である場合に true を返し,それ以外の場合には false を返す関数です.


#include <filesystem>

bool IsFileExist(const std::string& name) {
    return std::filesystem::is_regular_file(name);
}

C++のバージョンに依存させない方法

コンパイル時にC++17に対応しているかをチェックすることが可能です.


#if __cplusplus < 201703L
// C++17より前
#else
// C++17以降
#endif

このような表現を使うことで,C++17以前,以降でプログラムを書き直す必要性がなくなります.


#include <iostream>
#include <string>

#if __cplusplus < 201703L 

#include <sys/types.h>
#include <sys/stat.h>

bool IsFileExist(const std::string& name) {
    struct stat buffer;
    return (stat(name.c_str(), &buffer) == 0 && S_ISREG(buffer.st_mode));
}

#else // C++17以降の場合

#include <filesystem>

bool IsFileExist(const std::string& name) {
    return std::filesystem::is_regular_file(name);
}

#endif

int main() {
    std::string filename = "example.txt";
    if (IsFileExist(filename)) {
        std::cout << "File " << filename << " exists!" << std::endl;
    } else {
        std::cout << "File " << filename << " does not exist!" << std::endl;
    }
    return 0;
}

まとめ

この記事では,C++でファイルの存在確認を行う方法について解説しました.C++17より前と以降の方法を紹介し,またC++のバージョンに依存しない方法も示しました.

C++17よりの場合は,Linux/Unixシステム向けのstat関数を用いてファイルの属性を調べることで,ファイルの存在確認を行いました.

一方,C++17以降では,std::filesystemライブラリのis_regular_file()関数を用いることで,簡単かつ効率的にファイルの存在確認を行いました.

C++のバージョンに依存させないために,__cplusplusマクロを用いた方法を示しました.

よかったらシェアしてね!
目次