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

时间:2010-12-09 23:00:22

标签: c++ windows file-io

  

可能重复:
  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)

由于

11 个答案:

答案 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)

这里有两件事需要考虑:

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

  2. 但是,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;
}