WINAPI:文件存在检查失败

时间:2017-02-02 06:07:30

标签: c++ visual-studio c++11 winapi visual-studio-2012

我想检查指定位置是否存在某个文件。我一直在尝试多种解决方案,但似乎没有一种方法可以正常工作,因为它们都返回错误。

毫无疑问,该文件存在于指定位置。

可执行文件以管理员身份运行,因此我拥有相应的权限。

我使用的代码:

#include <io.h>
#include <string>
#include <Shlwapi.h>

std::string str = "C:\WINDOWS\System32\iluminated.dll";
unsigned long attrib = GetFileAttributes(str.c_str());

bool exists1 = (attrib != INVALID_FILE_ATTRIBUTES && 
            !(attrib & FILE_ATTRIBUTE_DIRECTORY)) &&
            GetLastError() != ERROR_FILE_NOT_FOUND; // false
bool exists2 = ( _access( str.c_str(), 0 ) != -1 ); // false
bool exists3 = PathFileExists(str.c_str()) != 0; // false

我有什么不对的吗?

2 个答案:

答案 0 :(得分:4)

您应该对路径使用双反斜杠,因为如果在字符串中使用单个反斜杠,它们将被解释为命令符号(例如,行\n):

"C:\\WINDOWS\\System32\\iluminated.dll"

或者,您可以使用正斜杠,它们适用于大多数操作系统:

"C:/WINDOWS/System32/iluminated.dll"

答案 1 :(得分:1)

我找到了答案。事实证明,在尝试访问64位Windows时,Windows总是将system32重定向到syswow64。我不得不使用SysNative目录,即使它不存在 - Windows将其重定向到正确的system32目录。

  

自Visual Studio 2012起,应用程序项目默认为“任何CPU”   32位首选“。如果您在64位Windows上运行此类可执行文件   操作系统,然后它将作为一个32位进程启动并且   受WOW64文件系统重定向影响。

     

当64位Windows上的32位进程尝试访问时   “C:\ Windows \ System32”,WOW64将其重定向到“C:\ Windows \ SysWOW64”。   有几种方法可以访问真正的“C:\ Windows \ System32”   目录:

     
      
  • 使用“C:\ Windows \ SysNative”,WOW64重定向到“C:\ Windows \ System32”,即使它没有出现在目录中   列表。这是一种简单的方法,不太可能导致问题。
  •   
  • 使用Wow64DisableWow64FsRedirection和Wow64RevertWow64FsRedirection。
  •   
  • 使用64位进程。
  •   

来源:https://social.msdn.microsoft.com/Forums/en-US/c54f8368-035e-478e-b988-b180a3c7e3da/file-not-found-for-existing-file-in-system32-directory?forum=csharpgeneral