如何使用 C++ 和 winAPI 检查目录是不是存在 [重复]
Posted
技术标签:
【中文标题】如何使用 C++ 和 winAPI 检查目录是不是存在 [重复]【英文标题】:How to check if directory exist using C++ and winAPI [duplicate]如何使用 C++ 和 winAPI 检查目录是否存在 [重复] 【发布时间】:2012-01-04 06:03:22 【问题描述】:如何使用 C++ 和 windows API 检查目录是否存在?
【问题讨论】:
为什么不直接像msdn.microsoft.com/en-us/library/windows/desktop/…那样做BOOL PathFileExists(pszPath);
?
【参考方案1】:
这是一个简单的函数,它就是这样做的:
#include <windows.h>
#include <string>
bool dirExists(const std::string& dirName_in)
DWORD ftyp = GetFileAttributesA(dirName_in.c_str());
if (ftyp == INVALID_FILE_ATTRIBUTES)
return false; //something is wrong with your path!
if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
return true; // this is a directory!
return false; // this is not a directory!
【讨论】:
GetFileAttributes()
在发生故障时返回INVALID_FILE_ATTRIBUTES
。你必须使用GetLastError()
来找出失败的真正原因。如果它返回ERROR_PATH_NOT_FOUND
、ERROR_FILE_NOT_FOUND
、ERROR_INVALID_NAME
或ERROR_BAD_NETPATH
,那么它确实不存在。但如果它返回大多数其他错误,那么在指定路径中确实存在某些东西,但属性根本无法访问。
对于那些偶然发现这个答案的人,请记住,上面的代码是 ANSI 而不是 Unicode。对于现代 Unicode,最好采用 LPCTSTR 参数,例如另一个 *** 答案中的 sn-p:***.com/a/6218445。 (LPCTSTR 将被编译器翻译成wchar_t*
。)。然后,您可以包装该 Unicode 感知函数以采用 C++ std::wstring
而不是 std::string
。【参考方案2】:
如果你可以链接到 shell 轻量级 API (shlwapi.dll),你可以使用PathIsDirectory function
【讨论】:
【参考方案3】:此代码可能有效:
//if the directory exists
DWORD dwAttr = GetFileAttributes(str);
if(dwAttr != 0xffffffff && (dwAttr & FILE_ATTRIBUTE_DIRECTORY))
【讨论】:
【参考方案4】:0.1 秒谷歌搜索:
BOOL DirectoryExists(const char* dirName)
DWORD attribs = ::GetFileAttributesA(dirName);
if (attribs == INVALID_FILE_ATTRIBUTES)
return false;
return (attribs & FILE_ATTRIBUTE_DIRECTORY);
【讨论】:
以上是关于如何使用 C++ 和 winAPI 检查目录是不是存在 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c++字符串
如何安全地调用 TerminateThread 和 FreeLibrary (WinAPI, C++)
如何在c ++ winapi中获取活动文件资源管理器窗口的路径