我们如何使用Win32程序检查文件是否存在?

时间:2010-09-30 08:05:20

标签: windows winapi file

我们如何使用Win32程序检查文件是否存在?我正在为Windows Mobile App工作。

8 个答案:

答案 0 :(得分:187)

使用GetFileAttributes检查文件系统对象是否存在,以及它不是目录。

BOOL FileExists(LPCTSTR szPath)
{
  DWORD dwAttrib = GetFileAttributes(szPath);

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

How do you check if a directory exists on Windows in C?

复制

答案 1 :(得分:32)

您可以使用GetFileAttributes功能。如果文件不存在,则返回0xFFFFFFFF

答案 2 :(得分:22)

您可以拨打FindFirstFile

以下是我刚敲过的一个样本:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

int fileExists(TCHAR * file)
{
   WIN32_FIND_DATA FindFileData;
   HANDLE handle = FindFirstFile(file, &FindFileData) ;
   int found = handle != INVALID_HANDLE_VALUE;
   if(found) 
   {
       //FindClose(&handle); this will crash
       FindClose(handle);
   }
   return found;
}

void _tmain(int argc, TCHAR *argv[])
{
   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Looking for file is %s\n"), argv[1]);

   if (fileExists(argv[1])) 
   {
      _tprintf (TEXT("File %s exists\n"), argv[1]);
   } 
   else 
   {
      _tprintf (TEXT("File %s doesn't exist\n"), argv[1]);
   }
}

答案 3 :(得分:16)

简单地说:

#include <io.h>
if(_access(path, 0) == 0)
    ...   // file exists

答案 4 :(得分:7)

另一种选择:'PathFileExists'

但我可能会选择GetFileAttributes

答案 5 :(得分:1)

您可以尝试打开该文件。如果失败,则意味着大部分时间都不存在。

答案 6 :(得分:0)

遇到了同样的问题,并在另一个使用 forum 方法的 GetFileAttributes 中找到了这个简短的代码

DWORD dwAttr = GetFileAttributes(szPath);
if (dwAttr == 0xffffffff){

  DWORD dwError = GetLastError();
  if (dwError == ERROR_FILE_NOT_FOUND)
  {
    // file not found
  }
  else if (dwError == ERROR_PATH_NOT_FOUND)
  {
    // path not found
  }
  else if (dwError == ERROR_ACCESS_DENIED)
  {
    // file or directory exists, but access is denied
  }
  else
  {
    // some other error has occured
  }

}else{

  if (dwAttr & FILE_ATTRIBUTE_DIRECTORY)
  {
    // this is a directory
  }
  else
  {
    // this is an ordinary file
  }
}

其中 szPath 是文件路径。

答案 7 :(得分:-1)

另一种更通用的非Windows方式:

static bool FileExists(const char *path)
{
    FILE *fp;
    fpos_t fsize = 0;

    if ( !fopen_s(&fp, path, "r") )
    {
        fseek(fp, 0, SEEK_END);
        fgetpos(fp, &fsize);
        fclose(fp);
    }

    return fsize > 0;
}