使用C ++获取系统文件夹

时间:2014-02-28 05:54:55

标签: c++ visual-c++

我正在开发VS 2010中的C ++项目。我想获得DESKTOP的路径,我已经编写了以下代码,这些代码已在一些教程中给出。

 TCHAR path[MAX_PATH];
 SHGetSpecialFolderPath(0,path,CSIDL_DESKTOP,FALSE); 
 printf("Path : %s",path);

但上面的代码刚打印

  

路径:C

请在上面的代码中进行修正

2 个答案:

答案 0 :(得分:3)

使用_tprintf

http://msdn.microsoft.com/en-us/library/wc7014hz.aspx

当TCHAR字符串传递给窄字符串函数(例如printf)时,数据将逐字节读取,并且当它到达第一个空字符('\ 0')时,它将被解释为字符串的结尾。这就是为什么它只打印TCHAR字符串的第一个字符。

_tprintf一次查看一个TCHAR,因此它会继续查看,直到它达到零TCHAR。

答案 1 :(得分:2)

我认为你的项目在设置中有一个字符串'Unicode'。 在这种情况下,TCHAR被视为wchar_t,SHGetSpecialFolderPath被定义为SHGetSpecialFolderPathW,因此,您获得的'DESKTOP'的路径是Unicode,因此您有两种选择来解决此问题。

  1. 1.使用'printf(“%S”)'用大写'S'而不是小写''来打印你的路径。
  2. 2.使用'wprintf(“%s”)'除了大写'S'以外的小写''打印你的路径。
  3. 也就是说,您可以使用相反的情况'S'或's'打印相反的char(char / wchar_t)。 我很高兴我可以帮助你! 哦,我忘了解释输出。 在你的代码中,路径是wchar_t,但是'%s'带有小写's',你的路径被'printf'视为char。

    路径中的wchar_t数据(16位)如下:

    {L'C',L''',L'W',L'i',L'n',L'd',L'o',L'w',L's',L'\ ',... / /}

    char数据(也称为字节数据,8位)如下:

    {'C','\ 0','\','\ 0','W','\ 0','i','\ 0',... / ie /}

    它看起来就像字符串“C”,因为“\ Windows ... / ** /”位于'null-terminal'标签'\ 0'后面,它被忽略了。