为啥 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 并使用TEXTmacro 来初始化指针。完毕。 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 函数可以扩展为 PathFileExistsWPathFileExistsA 【参考方案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() 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 innerHtml 不起作用

为啥第二个(兄弟)React Context Provider 不起作用?或者,如果上面有同级 Context Provider,为啥 React Context Provider 不起作用

修改php.ini不起作用是为啥

为啥这种方法不起作用?

为啥(ngModel)不起作用?

为啥 removeEventListener 不起作用