我想检查指定位置是否存在某个文件。我一直在尝试多种解决方案,但似乎没有一种方法可以正常工作,因为它们都返回错误。
毫无疑问,该文件存在于指定位置。
可执行文件以管理员身份运行,因此我拥有相应的权限。
我使用的代码:
#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
我有什么不对的吗?
答案 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位进程。