C++ 尝试创建目录,获取字符*到LPCWSTR错误,愿意尝试其他函数

C++ 尝试创建目录,获取字符*到LPCWSTR错误,愿意尝试其他函数,c++,windows,winapi,create-directory,C++,Windows,Winapi,Create Directory,我试过用谷歌搜索这个,有很多基于各种具体情况的答案,坦白地说,我比刚开始的时候更困了 事实是: 语言:C/C++ OS:Windows IDE:VisualStudio2005 我试图使用CreateDirectory(在#include of windows.h之后)从程序中的函数创建一个目录 据推测,第一个参数(路径)应该是char*。但是,当我尝试编译时,出现以下错误:错误C2664:“CreateDirectoryW”:无法将参数1从“char*”转换为“LPCWSTR” 我读到的是U

我试过用谷歌搜索这个,有很多基于各种具体情况的答案,坦白地说,我比刚开始的时候更困了

事实是:

  • 语言:C/C++
  • OS:Windows
  • IDE:VisualStudio2005
  • 我试图使用CreateDirectory(在#include of windows.h之后)从程序中的函数创建一个目录
  • 据推测,第一个参数(路径)应该是char*。但是,当我尝试编译时,出现以下错误:错误C2664:“CreateDirectoryW”:无法将参数1从“char*”转换为“LPCWSTR”
  • 我读到的是UNICODE和ANSI之间存在某种问题。解决方案千差万别,我害怕破坏一些重要的东西,或者做一些非常愚蠢的事情
  • 我完全愿意使用任何其他方法来创建一个新的目录,如果有一个目录存在的话,而不需要我找到其他的库
  • 我只是辅修comp-sci,坦率地说,我不知道为什么通过stdio打开、关闭、编辑和以其他方式访问文件如此容易,但对目录做任何事情(特别是制作目录并找出它们是否存在)都是互联网上的一场白鹅追逐
请帮助我修复CreateDirectory的当前尝试,或者使用其他方法创建目录

谢谢大家!

在包含
windows.h
之前,请尝试使用
#undef UNICODE
。除非你真的在用Unicode编码,但那是另一回事了

在新的Visual Studio中,
windows.h
默认为Unicode版本,因此
#undef Unicode
将返回ANSI版本。它将显示在堆栈跟踪中——您将调用
CreateDirectoryA
,而不是
CreateDirectoryW


或者,直接调用
CreateDirectoryA
,但不知何故,我觉得这不是一种最佳做法。

VS2005默认为Unicode,您最好保持这种方式。将来可能会给你省下很多麻烦。在Unicode构建中
CreateDirectory
(和其他Win32函数)需要
wchar\u t
字符串,而不是常规的
char
。使字符串文本
wchar\u t
很简单-

L“Some string”
使其始终为Unicode,或
\T(“Some string”)
使其依赖于配置


我不知道您究竟是如何调用
CreateDirectory
,但是如果将字符串转换为Unicode太麻烦,您可以直接使用ANSI版本-
CreateDirectoryA
。如果你想得到更详细的答案,请发布一些代码。

这太疯狂了。微软有机制从同一代码支持ANSI(他们称之为)和UNICODE,因为Windows95/8/Me是ANSI操作系统,NT/XP/Vista等是UNICODE操作系统。因此,如果您真的想这样做,您可以编写一组同时支持两个系统的代码,然后为每个系统重新编译

但是谁对Windows95/98/Me感兴趣呢?然而,这些东西让新手感到困惑

这里是重点,Windows中没有名为CreateDirectory的函数,有名为CreateDirectoryW的UNICODE函数和名为CreateDirectoryA的ANSI函数。宏CreateDirectory将转换为CreateDirectoryW或CreateDirectoryA,具体取决于您定义的编译器选项。如果最终使用CreateDirectoryW(正如您所做的),则必须向其传递Unicode字符串,如果使用CreateDirectoryA,则传递普通ASCII字符串

在您的情况下,最简单的事情就是忘记所有这些,直接调用CreateDirectoryA

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

为什么在C++中创建一个目录是如此困难?我猜是因为早在70年代,C还是新的,不是每个操作系统都有目录,所以这些东西从来没有成为语言标准。

我怎么知道我是否真的在使用Unicode?或者这是非常不寻常的/故意应用的?默认情况下您是Unicode。问题是您想使用Unicode吗?这完全取决于您:-)此外,eran建议使用
\u T()
宏也很好。@Andrew,我不会
\undef UNICODE
。首先,您可能会与其他编译单元不匹配,这些编译单元没有看到
undef
。其次,还有一个UNICODE定义(不记得现在哪个做什么…)。最后,最好使用常规设置这些功能。宏的目的是使您能够同时支持unicode和ansi。除非你想这样做,否则使用它有什么意义?只要说出你的意思并使用正确的字符串。@eran,你提出了一些非常好的观点,我同意你的观点。我认为最简单的解决方案是在使用
CreateDirectoryA
和只使用
wchar\u t
之间折腾。
char*path=(%s%s),顶部导出路径,顶部导出文件夹);CreateDirectory(路径,空)//这就是我尝试的
代码看起来不正确,但在任何情况下,您都有一个ASCII字符串,所以只需调用CreateDirectoryA即可。简单。@Rae,使用
wchar_t*path=;CreateDirectory(路径,空)。我使用了
,因为您创建字符串的方式是错误的。您可能只想使用它,或者如果您仅限于C,则使用
springtf
,但这与原来的问题不同……哦。对吗?顶部导出路径和顶部导出文件夹在程序开始时定义。我会试试CreateDirectoryA。看起来你认为它会连接TOP\u EXPORT\u路径和TOP\u EXPORT\u文件夹字符串。我保证它不会那样做的。打印路径的值以检查您所拥有的内容。在Windows XP上使用CreateDirectoryA会破坏任何东西吗?还是可以接受