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)
这里有两件事需要考虑:
通过其属性检查文件是否存在可能会快许多个数量级 - 如果文件存在于'慢'文件系统 - 磁带,网络存储,CD等,则打开文件将涉及到文件位置的实际往返.另一方面,文件系统驱动程序在查询目录时查询和缓存文件属性,因此探测文件属性涉及一次性目录枚举成本 - 意味着更少的往返次数 - 如果多次"慢"则可以显着节省正在检查文件.
但是,files属性仅表示在进行调用时文件存在.该文件可以删除,或者您可能没有权限访问它.如果您打算尝试打开文件,最好省略文件属性检查并实际尝试打开文件.
如何使用提升?
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
检查文件是否存在的唯一可靠方法是尝试打开它,看看它是成功还是失败。
任何其他方法都是潜在的竞争条件。例如,GetFileAttributes可以在您调用函数时告诉您文件是否存在,但这与您尝试打开它时是否存在不同。在此期间它可能已被删除(或创建)。
| 归档时间: |
|
| 查看次数: |
47926 次 |
| 最近记录: |