LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

目的

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

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0