Posted at

【Windows】【C++】_statでファイル・ディレクトリの存否チェック


目的

Windows環境でC++でプログラミングしている際のファイル・ディレクトリの存否チェック方法を備忘録としてメモする。

C Run-Time Libraries (CRT)の関数_statを使うことで、指定したファイル・ディレクトリの存否チェックができる。


関数の概要

int _stat(const char *path, struct _stat *s);


パラメタ

第一引数に存否チェックしたいパス文字列を渡す。

第二引数にはおまじないのようにstruct _statのポインタを渡す。

第一引数に渡したpathが存在した場合に、それがファイルなのかディレクトリなのか判別したい場合、この構造体のメンバst_modeのフラグをチェックする(後述の例を参照)。


戻り値

pathが存在すれば1、存在しなければ-1が返される。


ワイド文字列版

パス文字列としてワイド文字列を渡したい場合は_wstatが使える。第一引数の型が異なる以外は、_statと同様の振る舞いをする。

int _wstat(const wchar_t *path, struct _stat *s);


動作確認はVisual Studio 2017。

#include <direct.h>

#include <sys/stat.h>
#include <assert.h>
#include <fstream>

int main()
{
const char* FILE_NAME = "file.txt";
const char* DIR_NAME = "dir";
const wchar_t* FILE_NAME_W = L"file.txt";

// ファイルを作っておく
{
std::ofstream ofs(FILE_NAME);
ofs << "file";
ofs.close();
}
// ディレクトリを作っておく
_mkdir(DIR_NAME);

struct _stat s;
int rc = _stat(FILE_NAME, &s);
assert(rc == 0); // 指定パスが存在する場合、戻り値が0
assert(s.st_mode & _S_IFREG); // ファイルの場合、_S_IFREGフラグがセットされている

rc = _stat(DIR_NAME, &s);
assert(rc == 0); // 指定パスが存在する場合、戻り値が0
assert(s.st_mode & _S_IFDIR); // ディレクトリの場合、_S_IFDIRフラグがセットされている

rc = _stat("not_exist_file", &s);
assert(rc == -1); // 指定パスが存在しない場合、戻り値が-1

rc = _wstat(FILE_NAME_W, &s); // ワイド文字列も同様に利用できる。
assert(rc == 0); // 指定パスが存在する場合、戻り値が0
assert(s.st_mode & _S_IFREG); // ファイルの場合、_S_IFREGフラグがセットされている
}


参考

_stat, _stat32, _stat64, _stati64, _stat32i64, _stat64i32, _wstat, _wstat32, _wstat64, _wstati64, _wstat32i64, _wstat64i32 | Microsoft Docs