3

我想验证文件的存在,经过一番搜索,我认为 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"); PathFileExists() 的 MSDN 参考示例代码有点过时。直接用于 PathFileExists()的参考示例char *,在 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; 
} 

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

4

1 回答 1

2

我认为问题在于您需要将char字符串转换为 aTSTR而您没有这样做。

您正在使用类型转换来强制从类型char *到类型的指针,LPCTSTR但我认为这实际上不起作用。据我了解, aTCHAR要么是相同的东西,char要么是“宽字符”。我认为你必须TCHAR设置为宽字符,否则你不会有问题。

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

在 C/C++(ms) 中将 char[] 转换为 tchar[] 的最简单方法是什么?

你可以打电话试试看MultiByteToWideChar()能不能解决问题。

于 2012-06-11T07:57:30.213 回答