可能重复:
How can we check if a file Exists or not using Win32 program?
检查文件存在的最佳方法是:
选项1:
GetFileAttributes("C:\\MyFile.txt"); // from winbase.h
if(0xffffffff == GetFileAttributes("C:\\MyFile.txt"))
{
//File not found
}
选项2:
std::string fileName("C:\\MyFile.txt" );
ifstream fin( fileName.c_str() );
if( fin.fail() )
{
//File not found
}
另外如果您认为选项1是更好的方法,您能告诉我如何将0xffffffff
定义为常量(我不想使用#define)
由于
答案 0 :(得分: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
}
答案 1 :(得分:8)
这里有两件事需要考虑:
通过其属性检查文件是否存在可能要快几个数量级 - 如果文件存在于'慢'文件系统 - 磁带,网络存储,cd等,那么打开文件将涉及实际轮次访问文件位置。另一方面,文件系统驱动程序在查询目录时查询和缓存文件属性,因此探测文件属性涉及一次性目录枚举成本 - 意味着更少的往返次数 - 如果多次“慢”则可以显着节省正在检查文件。
但是,files属性仅表示在进行调用时文件存在。该文件可以删除,或者您可能没有权限访问它。如果您打算尝试打开文件,最好省略文件属性检查并实际尝试打开文件。
答案 2 :(得分:5)
如果您只定位Windows,那么选项#1显然是两者中的优势。此外,您正在寻找的常量已经存在于Windows标头中 - 它被称为INVALID_FILE_ATTRIBUTES
。
答案 3 :(得分:5)
如何使用boost?
if (!boost::filesystem::exists("C:\\MyFile.txt"))
{
...
}
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
答案 4 :(得分:4)
检查文件是否存在的唯一强大方法是尝试打开它,看看它是成功还是失败。
任何其他方法都是潜在的竞争条件。例如,当您调用函数时,GetFileAttributes
可以告诉您文件是否存在,但是当您尝试打开它时,它与它是否存在不同。它可能在此期间被删除(或创建)。
答案 5 :(得分:3)
我更喜欢第一个。第二个检查是否可以打开文件,而文件可能存在,而您无权打开它。
您可以使用INVALID_FILE_ATTRIBUTES
常量。
答案 6 :(得分:2)
由于其平台独立性,我选择使用iostream
。没错,您可能只针对Windows,但使用与平台无关的库绝不是一个坏举措。如果你正在建立一个大项目,你永远不知道下一阶段会带来什么。
我不确定上面的代码是检查文件存在的最佳(或正确)方法。试试this:
ifstream f;
f.open(str);
if (f.is_open()) {
// read file
}
答案 7 :(得分:2)
我还要确认该字符串不是目录:
DWORD attr = GetFileAttributes(file);
if(attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY))
return false; // not a file
return true;
答案 8 :(得分:2)
在当天,我们所拥有的只是OpenFile(而且我们是GRATEFUL)
OFSTRUCT of = {0};
of.cBytes = sizeof(of);
HFILE hf = ::OpenFile("c:\\windows\\write.exe",&of,OF_EXIST);
if(hf > 0)
printf("file exists");
return 0;
答案 9 :(得分:2)
有一个很好的shell实用程序函数,PathFileExists。
答案 10 :(得分:0)
#include <iostream>
#include <windows.h>
using namespace std;
bool FileExists(const TCHAR *fileName)
{
DWORD fileAttr;
fileAttr = GetFileAttributes(fileName);
if (0xFFFFFFFF == fileAttr && GetLastError()==ERROR_FILE_NOT_FOUND)
return false;
return true;
}
int main(int argc, char *argv[])
{
if ( FileExists("testtt.txt"))
{
cout << "File exists \n";
}
else
{
cout << "File does not exist \n";
}
return 0;
}