C++:哪个是在Windows平台上检查文件存在的最佳方法

Rob*_*boy 15 c++ windows file-io

可能重复:
我们如何使用Win32程序检查文件是否存在?

检查文件存在的最佳方法是:

选项1:

GetFileAttributes("C:\\MyFile.txt"); // from winbase.h
if(0xffffffff == GetFileAttributes("C:\\MyFile.txt"))
{
    //File not found
}
Run Code Online (Sandbox Code Playgroud)

选项2:

std::string fileName("C:\\MyFile.txt" );
ifstream fin( fileName.c_str() );

if( fin.fail() )
{
    //File not found
}
Run Code Online (Sandbox Code Playgroud)

另外如果您认为选项1是更好的方法,您能告诉我如何定义0xffffffff为常量(我不想使用#define)

谢谢

zda*_*dan 18

请注意,GetFileAttributes()可能由于缺少存在而导致其他原因失败(例如权限问题).我会添加一个检查错误代码的健壮性:

GetFileAttributes("C:\\MyFile.txt"); // from winbase.h
if(INVALID_FILE_ATTRIBUTES == GetFileAttributes("C:\\MyFile.txt") && GetLastError()==ERROR_FILE_NOT_FOUND)
{
    //File not found
}
Run Code Online (Sandbox Code Playgroud)

  • @ OldPeculier,Boost Filesystem使用以下错误代码作为路径不存在的指示符:ERROR_FILE_NOT_FOUND,ERROR_PATH_NOT_FOUND,ERROR_INVALID_NAME,ERROR_INVALID_DRIVE,ERROR_NOT_READY,ERROR_INVALID_PARAMETER,ERROR_BAD_PATHNAME,ERROR_BAD_NETPATH. (3认同)

Chr*_*cke 8

这里有两件事需要考虑:

  1. 通过其属性检查文件是否存在可能会快许多个数量级 - 如果文件存在于'慢'文件系统 - 磁带,网络存储,CD等,则打开文件将涉及到文件位置的实际往返.另一方面,文件系统驱动程序在查询目录时查询和缓存文件属性,因此探测文件属性涉及一次性目录枚举成本 - 意味着更少的往返次数 - 如果多次"慢"则可以显着节省正在检查文件.

  2. 但是,files属性仅表示在进行调用时文件存在.该文件可以删除,或者您可能没有权限访问它.如果您打算尝试打开文件,最好省略文件属性检查并实际尝试打开文件.


cas*_*nca 5

如果您只定位Windows,那么选项#1显然是两者中最好的.此外,您正在寻找的常量已存在于Windows标头中 - 它被调用INVALID_FILE_ATTRIBUTES.


Inv*_*rse 5

如何使用提升?

if (!boost::filesystem::exists("C:\\MyFile.txt"))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm

  • `boost :: filesystem :: exists(...)`在Windows上调用`GetFileAttributes()`. (7认同)

jal*_*alf 5

检查文件是否存在的唯一可靠方法是尝试打开它,看看它是成功还是失败。

任何其他方法都是潜在的竞争条件。例如,GetFileAttributes可以在您调用函数时告诉您文件是否存在,但这与您尝试打开它时是否存在不同。在此期间它可能已被删除(或创建)。