#pragma comment(lib,"shlwapi.lib")
#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>int main()
{
char str1[100] = "C:\\temp1"; //exist
if(PathIsDirectory(str1)==TRUE)
printf("%s\n","YES");
else printf("%s\n","NO"); char str2[100] = "C:\\temp2";//not exist
if(PathIsDirectory(str2)==TRUE)
printf("%s\n","YES");
else printf("%s\n","NO");
}目录C:\temp1是存在的,C:\temp2不存在,为何结果都是NO呢
试试 C:\\temp1\\ PathIsDirectory
Verifies that a path is a valid directory.
msdn是这样说的 Returns TRUE if the path is a valid directory (FILE_ATTRIBUTE_DIRECTORY is set), or FALSE otherwise.但是实际上是返回FILE_ATTRIBUTE_DIRECTORY(0x0000010)所以,要想正确的话,需要跟FALSE比,而不是和TRUE
不过,从另外一个意义上讲msdn也没错:因为非FALSE即为TRUE,所以。。 。。
唉,纠结的宏定义啊,附上正确运行的代码#pragma comment(lib,"shlwapi.lib")
#include <windows.h>
#include <shlwapi.h>
#include <stdio.h>int main()
{
char str1[100] = "C:\\temp1"; //exist
if(!PathIsDirectoryA(str1))
printf("%s\n","NO");
else printf("%s\n","YES"); char str2[100] = "C:\\temp2";//not exist
if(!PathIsDirectoryA(str2))
printf("%s\n","NO");
else printf("%s\n","YES");
}
不过一般都是说return a non-zero value if xxx,很少有直接说return TRUE的。
看下这个函数里面的实现:.text:770F4299 push esi ; lpFileName
.text:770F429A call ds:__imp__GetFileAttributesA@4 ; GetFileAttributesA(x)
.text:770F42A0 cmp eax, 0FFFFFFFFh
.text:770F42A3 jz short loc_770F42AA
.text:770F42A5 and eax, 10h <------ 就这儿了
.text:770F42A8 jmp short loc_770F42AC
.text:770F42AA ; ---------------------------------------------------------------------------
.text:770F42AA
.text:770F42AA loc_770F42AA: ; CODE XREF: PathIsDirectoryA(x)+5Ej
.text:770F42AA ; PathIsDirectoryA(x)+6Cj ...
.text:770F42AA xor eax, eax
.text:770F42AC
.text:770F42AC loc_770F42AC: ; CODE XREF: PathIsDirectoryA(x)+F9j
.text:770F42AC ; PathIsDirectoryA(x)+112j
.text:770F42AC mov ecx, [ebp+var_4]
.text:770F42AF pop esi
.text:770F42B0 pop ebx
.text:770F42B1 call @__security_check_cookie@4 ; __security_check_cookie(x)
.text:770F42B6 leave
.text:770F42B7 retn 4
.text:770F42B7 _PathIsDirectoryA@4 endp
谢谢,呵呵,我也是被msdn给误导的
原来是GetFileAttributes,看到10h好像在哪见到过~~