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

Kri*_*nan 67 windows winapi file

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

Zac*_*ame 197

使用GetFileAttributes检查文件系统对象存在,它不是一个目录.

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

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
Run Code Online (Sandbox Code Playgroud)

复制自如何在C中检查Windows上是否存在目录?

  • +1因为一个简短的代码示例.代码示例可以节省时间. (5认同)
  • 尽管`GetFileAttributes()` 可能由于文件不存在以外的错误条件而返回`INVALID_FILE_ATTRIBUTES`。 (2认同)

cod*_*ict 34

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

  • 关于GetFileAttributes的有趣历史及其为什么它是Windows代码中的首选方法Raymond Chen:http://blogs.msdn.com/b/oldnewthing/archive/2007/10/23/5612082.aspx (14认同)
  • 实际上,如果文件不存在,它返回`INVALID_FILE_ATTRIBUTES`.在64位上它可能是'0xFFFFFFFFFFFFFFFF`. (8认同)
  • @AndreasSpindler,因为返回类型是`DWORD`它怎么能返回'0xFFFFFFFFFFFFFFFF`? (6认同)
  • 您需要检查作为目录的对象. (2认同)
  • 更新了 Raymond Chen 博客的链接:https://devblogs.microsoft.com/oldnewthing/20071023-00/?p=24713 (2认同)

Pre*_*gha 24

你可以打电话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]);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 一半纠正.您需要检查FILE_ATTRIBUTE_DIRECTORY. (4认同)
  • 假设`file ="*"`,即使没有名为*的文件,也可能返回`true` (4认同)
  • 解决方案差;GetFileAttributes()更好。 (3认同)
  • 有关更好的方法,请参阅其他答案.此外,由于在fileExists()中使用argv [1],代码甚至不会按原样编译; (2认同)
  • GetFileAttributes是一个衬里 (2认同)

Pie*_*rre 16

怎么样简单:

#include <io.h>
if(_access(path, 0) == 0)
    ...   // file exists
Run Code Online (Sandbox Code Playgroud)

  • @Buddhika Chaturanga我早在80年代就开始在Borland Turbo C中使用它。在发烧友“ CreateFile”之前,这是检查文件是否存在的唯一方法。它埋在Visual Studio文档中。 (2认同)

Adr*_*thy 8

另一种选择: 'PathFileExists'.

但我可能会去GetFileAttributes.

  • 另外,`PathFileExists`要求使用“ Shlwapi.dll”(在某些Windows版本中不可用),并且比“ GetFileAttributes”稍慢。 (2认同)