C++ - 判断本机文件是否存在的方式总结

由于C++没有像python那样方便的os.path官方库,经常面临着判断一个文件是否在本机上存在都不易用,今天就总结下C++下判断本机文件是否存在的一些方法。

1 通用方法

1.1 使用std::ifstream判断

#include <iostream>
#include <fstream>

bool Is_File_Exist(const std::string& file_path)
{
    std::ifstream file(file_path.c_str());
    return file.good();
}

int main()
{
    if (Is_File_Exist("test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    return 0;
}

1.2 使用fopen判断

#include <iostream>
#include <fstream>

bool Is_File_Exist(const std::string& file_path)
{
    if (FILE* file = fopen(file_path.c_str(), "r"))
    {
        fclose(file);
        return true;
    }
    else 
    {
        return false;
    }
}

int main()
{
    if (Is_File_Exist("test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}

1.3 使用C++ 17的std::filesystem::exists判断

如使用vs2019并强制设置C++语言标准为C++17,linux请选择合适的GCC或者G++版本

#include <iostream>
#include <filesystem>


bool Is_File_Exist(const std::string& file_path)
{
    return std::filesystem::exists(file_path);
}

int main()
{
    if (Is_File_Exist("test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}

1.4 使用access判断

#include <iostream>

#ifdef _WIN32
#include <io.h> 
#define access    _access_s
#else
#include <unistd.h>
#endif

bool Is_File_Exist(const std::string& file_path)
{
    return access(file_path.c_str(), 0) == 0;
}

int main()
{
    if (Is_File_Exist("test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}

1.5 使用stat判断

#include <iostream>
#include <Windows.h>

bool Is_File_Exist(const std::string& file_path)
{
    struct stat buffer;
    return (stat(file_path.c_str(), &buffer) == 0);
}

int main()
{
    if (Is_File_Exist("test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}

2 Windows上的方法

2.1 使用Windows API CreateFile判断

#include <iostream>
#include <Windows.h>

bool Is_File_Exist(const std::wstring& file_path)
{
    bool result = true;

    HANDLE fileHandle = CreateFile(
        file_path.c_str(),
        GENERIC_READ,
        0,
        NULL,
        OPEN_EXISTING,
        0,
        NULL);

    if ((fileHandle != NULL) && (fileHandle != INVALID_HANDLE_VALUE))
        CloseHandle(fileHandle);
    else
    {
        DWORD error = GetLastError();

        if ((error == ERROR_FILE_NOT_FOUND) || (error == ERROR_PATH_NOT_FOUND))
            result = false;
    }

    return result;
}

int main()
{
    if (Is_File_Exist(L"test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}

2.2 使用Windows API GetFileAttributes判断

#include <iostream>
#include <Windows.h>

bool Is_File_Exist(const std::wstring& file_path)
{
    return GetFileAttributes(file_path.c_str()) != INVALID_FILE_ATTRIBUTES;
}

int main()
{
    if (Is_File_Exist(L"test.txt"))
    {
        std::cout << "文件存在" << std::endl;
    }
    else
    {
        std::cout << "文件不存在" << std::endl;
    }

    getchar();

    return 0;
}