Вопрос:
Я хочу проверить наличие файла, и после некоторого поиска я думаю, что 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 existn»); }else{ printf(«exists!n»); } return 0; }
Можете ли вы объяснить проблему?
UPDATE
Проведите почти весь день и выясните проблему.
Функция PathFileExists() ожидает второй параметр типа LPCTSTR. Однако компилятор не может правильно преобразовать char * в LPCTSTR, тогда я включаю tchar.h и используя макрос TEXT для инициализации указателя. Готово.
LPCTSTR lpPath = TEXT ( “c:WindowsSystem32cmd.exe” ); Примерный пример кода MSDN для PathFileExists() является устаревшим. В ссылочном примере используется char * непосредственно для PathFileExists() и не может проходить компиляцию в бета-версии visual studio 2011. А также, пример кода пропустил 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 existn»); }else{ printf(«exists!n»); } return 0; }
Прошу прощения за решение здесь, но я действительно хочу опубликовать некоторые мысли после целой дневной работы и надеюсь, что это поможет другим новичкам.
Лучший ответ:
Я считаю, что проблема в том, что вам нужно преобразовать строку char в TSTR, и вы этого не делаете.
Вы используете тип cast, чтобы наложить указатель на тип char * на тип LPCTSTR, но я думаю, что это действительно не работает. Насколько я понимаю, a TCHAR – это то же самое, что и char, или же это “широкий char”. Я думаю, что у вас должен быть TCHAR установлен на широкий char, иначе у вас не было бы проблем.
Я нашел ответ StackOverflow, который содержит информацию, которая может вам помочь:
Каков самый простой способ преобразования char [] в/из tchar [] в C/С++ (ms)?
Вы можете попробовать позвонить MultiByteToWideChar() и посмотреть, устраняет ли это проблему.