没有使用 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 中函数说明的返回值列表中。
所以,这个坑,不浅。
参考: