9

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

事实是这些:

  • 语言: C/C++
  • 操作系统: Windows
  • 集成开发环境: Visual Studio 2005
  • 我正在尝试使用 CreateDirectory(在 windows.h 的#include 之后)从程序中的函数创建目录。
  • 假设第一个参数(路径)应该是 char*。但是,当我尝试编译时,出现以下错误:错误 C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
  • 我读到的是我在 UNICODE 和 ANSI 之间存在某种问题。解决方案千差万别,我害怕破坏重要的东西,或者做一些非常愚蠢的事情。
  • 我非常愿意使用任何其他方法来创建一个新目录,如果一个存在而我不必找到其他库。
  • 我只辅修了comp sci,坦率地说,我不知道为什么通过stdio打开、关闭、编辑和以其他方式访问文件如此容易,但是对目录做任何事情(特别是制作它们并找出它们是否存在)是一种狂野鹅在互联网的街头追逐。

请帮助我,修复当前对 CreateDirectory 的尝试或使用其他东西来创建目录。

谢谢!

4

3 回答 3

12

这完全是疯了。微软有机制支持 ANSI(他们称之为)和 UNICODE 来自相同的代码,因为 Windows 95/8/Me 是 ANSI 操作系统,而 NT/XP/Vista 等是 UNICODE 操作系统。因此,如果您真的愿意,您可以编写一组支持两个系统的代码,然后为每个系统重新编译。

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

这是牛肉,在 Windows 中没有名为 CreateDirectory 的函数,有一个名为 CreateDirectoryW 的 UNICODE 函数和一个名为 CreateDirectoryA 的 ANSI 函数。CreateDirectory将根据您定义的编译器选项转换为 CreateDirectoryW 或 CreateDirectoryA。如果您最终使用 CreateDirectoryW(正如您显然所做的那样),则必须将 Unicode 字符串传递给它,如果您使用 CreateDirectoryA,则传递普通的 ASCII 字符串。

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

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

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

于 2011-08-10T19:12:51.210 回答
2

VS2005 默认是 Unicode,你最好保持这种方式。将来可能会为您节省很多问题。在 Unicode 构建CreateDirectory(和其他 Win32 函数)中需要wchar_t字符串,而不是常规char的 . 制作字符串文字wchar_t很简单 -

L"Some string"使其始终为 Unicode,或_T("Some string")使其依赖于配置。

不知道你到底是怎么调用CreateDirectory的,不过如果把字符串转成Unicode太麻烦的话,可以直接用ANSI版本—— CreateDirectoryA。如果您想要更详细的答案,请发布一些代码。

于 2011-08-10T19:04:48.247 回答
1

#undef UNICODE包含windows.h. 除非你真的在编码 Unicode,但那是另一回事。

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

或者,直接打电话CreateDirectoryA,但不知何故,我觉得这不是最佳做法。

于 2011-08-10T18:59:49.543 回答