ファイルの存在を確認することは,プログラムでファイルを操作する際によく行われる処理です.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
マクロを用いた方法を示しました.