为啥 PathFileExists() 不起作用?
Posted
技术标签:
【中文标题】为啥 PathFileExists() 不起作用?【英文标题】:Why PathFileExists() not working?为什么 PathFileExists() 不起作用? 【发布时间】:2012-06-11 07:36:32 【问题描述】:我想验证文件是否存在,经过一番搜索后,我认为 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
macro 来初始化指针。完毕。
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;
很抱歉在这里添加解决方案,但我真的想在整个下午的工作后发表一些想法,希望对其他新手有所帮助。
【问题讨论】:
在失败后尝试调用GetLastError,看看出了什么问题。 请不要为在此处添加解决方案而道歉;这是伟大的。现在,您的问题将对在 *** 上找到它的其他人非常有帮助。我自己的回答给了你一个线索,但不是一个完整的答案,很高兴你发布了一个完整的答案。我已经给你 +1,但如果可以的话,我会再给你 +1。 引用没有过期;您可以在项目设置(常规 > 字符集)中指定您的应用程序是使用单字节字符串还是 unicode 字符串。这会影响 LPCTSTR 等宏是否扩展为wchar_t const*
或 char const*
,并且大多数 API 函数可以扩展为 PathFileExistsW
或 PathFileExistsA
。
【参考方案1】:
我认为问题在于您需要将 char
字符串转换为 TSTR
而您没有这样做。
您正在使用类型转换将指针从类型 char *
强制转换为类型 LPCTSTR
但我认为这实际上不起作用。据我了解,TCHAR
要么与 char
相同,要么是“宽字符”。我认为您必须将TCHAR
设置为宽字符,否则您不会有问题。
我找到了一个 *** 答案,其中包含可能对您有所帮助的信息:
What is the simplest way to convert char[] to/from tchar[] in C/C++(ms)?
您可以尝试拨打MultiByteToWideChar()
看看是否能解决问题。
【讨论】:
以上是关于为啥 PathFileExists() 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用