为什么PathFileExists()不起作用?

时间:2012-06-11 07:36:33

标签: c winapi

我想验证文件是否存在,经过一些搜索后我认为PathFileExists()可能适合这项工作。但是,以下代码始终显示该文件不存在。为确保文件确实存在,我选择cmd.exe的完整路径作为测试文件路径。我正在使用Windows 7(x64)

#include "stdafx.h" 
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include <WinDef.h>
#pragma comment( lib, "shlwapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{ 

    char path[] = "c:\\Windows\\System32\\cmd.exe";
    LPCTSTR szPath = (LPCTSTR)path;
    if(!PathFileExists(szPath)) 
    { 
        printf("not exist\n");  
    }else{
        printf("exists!\n"); 
    }
    return 0; 
} 

你能解释一下这个问题吗?

更新

花了差不多整个下午才弄明白问题。 PathFileExists()函数需要LPCTSTR类型的第二个参数。但是,编译器无法正确地将char *转换为LPCTSTR,然后我包含tchar.h并使用TEXT用于初始化指针的宏。完成。 LPCTSTR lpPath = TEXT(“c:\ Windows \ System32 \ cmd.exe”); The MSDN reference example code for PathFileExists()有点过时了。该参考示例直接使用char *用于PathFileExists(),并且无法在Visual Studio 2011 beta中传递编译。而且,示例代码错过了using namespace std; 其中,我认为@steveha的回答最接近真正的问题。谢谢大家。

最终的工作代码如下所示:

#include "stdafx.h" 
#include <stdio.h>
#include <windows.h>
#include <shlwapi.h>
#include <WinDef.h>
#include <tchar.h>
#pragma comment( lib, "shlwapi.lib")

int _tmain(int argc, _TCHAR* argv[])
{ 
    LPCTSTR lpPath = TEXT("c:\\Windows\\System32\\cmd.exe");
        if( PathFileExists(lpPath) == FALSE)  
    { 
        printf("not exist\n");  
    }else{
            printf("exists!\n"); 
    }
    return 0; 
} 

很抱歉在这里找到解决方案,但我真的想在整个下午的工作后发表一些想法,并希望能帮助其他新手。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您需要将char字符串转换为TSTR并且您不会这样做。

您正在使用类型转换来强制从类型char *到类型LPCTSTR的指针,但我认为这实际上并不起作用。据我了解,TCHARcharTCHAR相同,否则它是&#34;宽字符&#34;。我认为你必须将MultiByteToWideChar()设置为宽字符,否则你就不会有问题。

我找到了一个StackOverflow答案,其中包含可能对您有所帮助的信息:

What is the simplest way to convert char[] to/from tchar[] in C/C++(ms)?

您可以尝试拨打{{1}}并查看是否可以解决问题。