Преобразование ‘const char *’ в ‘LPCTSTR’ для CreateDirectory

#include "stdafx.h"#include <string>
#include <windows.h>
using namespace std;

int main()
{
string FilePath = "C:\\Documents and Settings\\whatever";
CreateDirectory(FilePath, NULL);
return 0;
}

Ошибка: ошибка C2664: «CreateDirectory»: невозможно преобразовать параметр 1 из «const char *» в «LPCTSTR»

  1. Как мне сделать это преобразование?
  2. Следующий шаг — установить сегодняшнюю дату в виде строки или символа и объединить ее с путем к файлу. Это изменится, как я делаю шаг 1?
  3. Я ужасен в типах данных и преобразованиях, есть ли хорошее объяснение для пятилетних детей?

2

Решение

std::string это класс, который содержит charна основе данных. Пройти std::string данные для функций API, вы должны использовать его c_str() способ получить char* указатель на фактические данные строки.

CreateDirectory() занимает TCHAR* в качестве ввода. Если UNICODE определено, TCHAR карты для wchar_tв противном случае он отображается на char вместо. Если вам нужно придерживаться std::string но не хочу делать свой код UNICODE-знай, потом используй CreateDirectoryA() вместо этого, например:

#include "stdafx.h"#include <string>
#include <windows.h>

int main()
{
std::string FilePath = "C:\\Documents and Settings\\whatever";
CreateDirectoryA(FilePath.c_str(), NULL);
return 0;
}

Сделать этот код TCHAR-назнаю, вы можете сделать это вместо:

#include "stdafx.h"#include <string>
#include <windows.h>

int main()
{
std::basic_string<TCHAR> FilePath = TEXT("C:\\Documents and Settings\\whatever");
CreateDirectory(FilePath.c_str(), NULL);
return 0;
}

Тем не менее, версии ОС на основе Ansi давно устарели, в настоящее время все Unicode. TCHAR больше не должен использоваться в новом коде:

#include "stdafx.h"#include <string>
#include <windows.h>

int main()
{
std::wstring FilePath = L"C:\\Documents and Settings\\whatever";
CreateDirectoryW(FilePath.c_str(), NULL);
return 0;
}
1

Другие решения

Если вы не создаете исполняемый файл Unicode, вызов c_str() на std :: string приведет к const char* (известный как не Unicode LPCTSTR), который вы можете передать CreateDirectory().

Код будет выглядеть так:

CreateDirectory(FilePath.c_str(), NULL):

Обратите внимание, что это приведет к ошибке компиляции, если вы попытаетесь создать исполняемый файл Unicode.

Если вам нужно добавить к FilePath Я бы порекомендовал вам либо продолжать использовать std::string или использовать Microsoft CString делать манипуляции со строками, так как это менее болезненно, чем делать это способом C и манипулировать необработанным символом *. Лично я бы использовал std::string если вы уже не в приложении MFC, которое использует CString.

0