SHCreateDirectory 的参数不支持根目录,会直接返回 ERROR_ACCESS_DENIED(5)

陪她去流浪 桃子 2016年04月16日 阅读次数:2957

没有使用 CreateDirectory 的原因是因为它不支持目录的递归创建,而 SHCreateDirectory 是可以递归创建的。

然而,MSDN 有时候真的很坑,一不小心就会踩到深坑。就比如 SHCreateDirectory,MSDN 的作用说明是:

Creates a new file system folder.

Remarks 部分的说明是:

This function creates a file system folder whose fully qualified path is given by pszPath. If one or more of the intermediate folders do not exist, it creates them.

多数人一定会把重点放在后面那句创建递归目录的功能上,不会注意到前面的“fully qualified path”,什么意思?文件系统完整路径。

什么才算是文件系统完整路径?“C:\”算吗?不算,不然今天我就不会踩到 SHCreateDirectory 的坑了。

SHCreateDirectory 在参数是根目录时会直接返回 5,而不是“文件(目录)已经存在之类”。这个 5 是不是 ERROR_ACCESS_DENIED 很难说,反正就是失败了。而且“5”这个返回值并没有出现在 MSDN 中函数说明的返回值列表中

所以,这个坑,不浅。

参考:

  1. SHCreateDirectory fails when pszPath = root drive
  2. SHCreateDirectory function (Windows)

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:WinAPI