使用标准的C++/C++11,14,17/C语言,检查文件是否存在的最快方法是什么?

630

我想找到在标准C++11、14、17或C中检查文件是否存在的最快方法。我有数千个文件,在对它们进行任何操作之前,我需要检查它们是否都存在。在下面的函数中,可以用什么代替/* SOMETHING */

inline bool exist(const std::string& name)
{
    /* SOMETHING */
}

26
你如何知道在进行exists()检查和“对其执行某些操作”之间文件未被删除?这是一个TOCTOU问题。 - pilcrow
10
不错的观点,但有很多应用程序并不需要那么高的正确性要求。例如,git push 命令可能不会在初始脏检查后再次确认您是否触及了工作树。 - millimoose
13
我想不出一个不需要它的C/C++实现。——Windows没有提供POSIX环境。 - Jim Balter
3
可能是“std :: ofstream,在写入之前检查文件是否存在”的重复问题。 - MD XF
3
为什么要这样做?比如说做些什么?如果需要打开文件,就尝试打开它并处理不存在的错误。在此之前添加另一个检查只是浪费时间和空间,并且会增加时间窗口问题。 - user207421
显示剩余8条评论
23个回答

0
使用 MFC,可以通过以下方法实现。
CFileStatus FileStatus;
BOOL bFileExists = CFile::GetStatus(FileName,FileStatus);

其中FileName是表示您要检查是否存在的文件的字符串


-1

检测 Windows 中是否存在一个文件。

bool DoesExistFile(std::wstring filePath)
{
    bool result = true;

    HANDLE fileHandle = CreateFile(
        filePath.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;
}

1
如果 Windows 中没有访问控制,这应该是可行的。但实际上,访问控制是 Windows 中的核心安全原语。不过,如果想要快速且减少误报,可以使用 GetFileAttributes(参见 迷信:为什么 GetFileAttributes 是老手测试文件存在的方法?)。 - IInspectable
@IInspectable 感谢您的评论和链接,我非常感激。在我的特定情况下,使用Cloud Filter API,这是唯一有效的方法来检查已删除占位符文件的现有父文件夹。我尝试了statGetFileAttributes函数,但它们都不起作用。 - Juan Carlos
CF API 是建立在文件系统之上的虚拟化技术。这个问题是在询问文件系统本身,而非建立在其之上的虚拟化技术。 - IInspectable
无论如何,我希望能够帮助那些遇到类似问题的人。 - Juan Carlos
在这种情况下,您应该发布一个新问题,以便这个提议的答案可以被应用。然后您可以 回答自己的问题 - IInspectable

-6

虽然有几种方法可以实现这个目标,但最有效的解决方案可能是使用fstream的预定义方法之一,例如good()。使用此方法,您可以检查您指定的文件是否存在。

fstream file("file_name.txt");

if (file.good()) 
{
    std::cout << "file is good." << endl;
}
else 
{
    std::cout << "file isnt good" << endl;
}

希望这对你有用。


5
如果文件不存在,这段代码将创建该文件,因此结果始终为真。您需要使用ifstream或正确设置openmode参数。 - Lubo Antonov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接