WINAPI:文件存在检查失败
WINAPI: File exists check fail
我想检查指定位置是否存在某个文件。我一直在为此尝试多种解决方案,但似乎 none 它们都能正常工作,因为它们都是 return false。
毫无疑问该文件存在于指定位置。
可执行文件正在 运行 作为管理员,所以我拥有适当的权限。
我使用的代码:
#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
我做错了什么吗?
路径应使用双反斜杠,因为如果在字符串中使用单反斜杠,它们将被解释为命令符号(例如第 \n
行):
"C:\WINDOWS\System32\iluminated.dll"
或者,您可以使用正斜杠,它们适用于大多数操作系统:
"C:/WINDOWS/System32/iluminated.dll"
我找到了答案。原来 Windows 在尝试访问 64 位 Windows 时总是将 system32
重定向到 syswow64
。我不得不使用 SysNative
目录,即使它不存在 - Windows 将它重定向到正确的 system32 目录。
Since Visual Studio 2012, application projects default to “Any CPU
32-bit preferred”. If you run such an executable on a 64-bit Windows
operating system, then it will start as a 32-bit process and be
affected by WOW64 file system redirection.
When a 32-bit process on 64-bit Windows tries to access
"C:\Windows\System32", WOW64 redirects it to "C:\Windows\SysWOW64".
There are several ways to access the real "C:\Windows\System32"
directory:
- Use "C:\Windows\SysNative", which WOW64 redirects to "C:\Windows\System32" even though it does not appear in directory
listings. This is an easy way and unlikely to cause problems.
- Use Wow64DisableWow64FsRedirection and Wow64RevertWow64FsRedirection.
- Use a 64-bit process.
我想检查指定位置是否存在某个文件。我一直在为此尝试多种解决方案,但似乎 none 它们都能正常工作,因为它们都是 return false。
毫无疑问该文件存在于指定位置。
可执行文件正在 运行 作为管理员,所以我拥有适当的权限。
我使用的代码:
#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
我做错了什么吗?
路径应使用双反斜杠,因为如果在字符串中使用单反斜杠,它们将被解释为命令符号(例如第 \n
行):
"C:\WINDOWS\System32\iluminated.dll"
或者,您可以使用正斜杠,它们适用于大多数操作系统:
"C:/WINDOWS/System32/iluminated.dll"
我找到了答案。原来 Windows 在尝试访问 64 位 Windows 时总是将 system32
重定向到 syswow64
。我不得不使用 SysNative
目录,即使它不存在 - Windows 将它重定向到正确的 system32 目录。
Since Visual Studio 2012, application projects default to “Any CPU 32-bit preferred”. If you run such an executable on a 64-bit Windows operating system, then it will start as a 32-bit process and be affected by WOW64 file system redirection.
When a 32-bit process on 64-bit Windows tries to access "C:\Windows\System32", WOW64 redirects it to "C:\Windows\SysWOW64". There are several ways to access the real "C:\Windows\System32" directory:
- Use "C:\Windows\SysNative", which WOW64 redirects to "C:\Windows\System32" even though it does not appear in directory listings. This is an easy way and unlikely to cause problems.
- Use Wow64DisableWow64FsRedirection and Wow64RevertWow64FsRedirection.
- Use a 64-bit process.