目的
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フラグがセットされている
}