Попытка CreateDirectory, получение ошибки char * to LPCWSTR, желание попробовать другую функцию - PullRequest
9 голосов
/ 10 августа 2011

Я пытался найти это в Google, и есть так много ответов, основанных на различных конкретных ситуациях, что, честно говоря, я застрял больше, чем когда я начинал.

Факты таковы:

  • Язык: C / C ++
  • ОС: Windows
  • IDE: Visual Studio 2005
  • Я пытаюсь создать каталог из функции в моей программе, используя CreateDirectory (после #include of windows.h).
  • Предположительно, первый параметр (путь) должен бытьсимвол *.Однако, когда я пытаюсь скомпилировать, я получаю следующую ошибку: ошибка C2664: «CreateDirectoryW»: невозможно преобразовать параметр 1 из «char *» в «LPCWSTR»
  • Что я прочитал, так это то, что у меня есть некоторыесвоего рода проблема между UNICODE и ANSI.Решения сильно различаются, и я боюсь сломать что-то важное или сделать что-то очень глупое.
  • Я совершенно готов использовать любой другой метод создания нового каталога, если он существует, и мне не нужно искать какой-либодругая библиотека.
  • Я разбираюсь только в компьютерной науке, и, честно говоря, я понятия не имею, почему так легко открывать, закрывать, редактировать и иным образом получать доступ к файлам через stdio, но делать что-либо с каталогами (в частности, создавая их ивыяснить, существуют ли они), это дикая погоня по улицам Интернета.

Пожалуйста, помогите мне, чтобы исправить текущую попытку CreateDirectory или использовать что-то еще для создания каталога.

Спасибо!

Ответы [ 3 ]

11 голосов
/ 10 августа 2011

Это совершенно безумие.У Microsoft есть механизмы для поддержки как ANSI (как они это называют), так и UNICODE из одного и того же кода, поскольку Windows 95/8 / Me были операционными системами ANSI, а NT / XP / Vista и т. Д. Являются операционными системами UNICODE.Поэтому, если вы действительно хотите, вы можете написать один набор кода, который поддерживает обе системы, и просто перекомпилировать для каждой системы.

Но кого больше интересует Windows 95/98 / Me?Тем не менее, этот материал продолжает сбивать с толку новичков.

Вот говядина, в Windows нет функции с именем CreateDirectory, есть функция UNICODE с именем CreateDirectoryW и функция ANSI с именем CreateDirectoryA. макрос CreateDirectory преобразуется в CreateDirectoryW или CreateDirectoryA в зависимости от того, какие параметры компилятора вы определили.Если вы в конечном итоге используете CreateDirectoryW (как вы, очевидно, и сделали), вы должны передать ей строку Unicode, если вы используете CreateDirectoryA, то вы передадите обычную строку ASCII.

В вашем случае проще всего было бы забытьобо всем этом и просто вызовите CreateDirectoryA напрямую.

CreateDirectoryA("c:\\some\\directory", NULL);

Почему так сложно создать каталог в C ++?Я предполагаю, что поскольку в 70-е годы, когда C был новым, не каждая операционная система имела каталоги, поэтому этот материал никогда не превращался в языковой стандарт.

2 голосов
/ 10 августа 2011

VS2005 по умолчанию является Unicode, и вам лучше оставить его таким. Может спасти вас много проблем в будущем. В сборках Unicode CreateDirectory (и другие функции Win32) ожидаются строки wchar_t, а не обычные char. Сделать строковые литералы wchar_t просто -

L"Some string", чтобы сделать его всегда Unicode, или _T("Some string"), чтобы сделать его зависимым от конфигурации.

Я не знаю, как именно вы звоните CreateDirectory, но если преобразование строки в Unicode является слишком большой проблемой, вы можете напрямую использовать версию ANSI - CreateDirectoryA. Напишите какой-нибудь код, если хотите получить более подробный ответ.

1 голос
/ 10 августа 2011

Попробуйте использовать #undef UNICODE перед включением windows.h. Если вы не действительно кодируете Unicode, но это уже другая история.

С новой версией Visual Studio windows.h по умолчанию принимает версию Unicode, поэтому #undef UNICODE вернет вам версию ANSI. Это будет показано в трассировке стека - вы будете звонить CreateDirectoryA, а не CreateDirectoryW.

Или, просто позвоните CreateDirectoryA напрямую, но почему-то я чувствую, что это не лучшая практика.

...