我想验证文件是否存在,经过一些搜索后我认为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;
}
很抱歉在这里找到解决方案,但我真的想在整个下午的工作后发表一些想法,并希望能帮助其他新手。
答案 0 :(得分:1)
我认为问题在于您需要将char
字符串转换为TSTR
并且您不会这样做。
您正在使用类型转换来强制从类型char *
到类型LPCTSTR
的指针,但我认为这实际上并不起作用。据我了解,TCHAR
或char
与TCHAR
相同,否则它是&#34;宽字符&#34;。我认为你必须将MultiByteToWideChar()
设置为宽字符,否则你就不会有问题。
我找到了一个StackOverflow答案,其中包含可能对您有所帮助的信息:
What is the simplest way to convert char[] to/from tchar[] in C/C++(ms)?
您可以尝试拨打{{1}}并查看是否可以解决问题。