如何在.net 3.5中获得CSIDL_COMMON_DOCUMENTS的路径
本文关键字:CSIDL COMMON DOCUMENTS 路径 net | 更新日期: 2023-09-27 18:18:34
我正在为安装程序做一个自定义操作。它必须读取存储在CSIDL_COMMON_DOCUMENTS
中的文件以确定安装目录。(我希望在自定义操作中更改安装目录不会有问题,但这是另一个问题。)
我看到。net 4将CommonDocuments
添加到Environment.SpecialFolder
。不幸的是,我被。net 3.5困住了。下一条最简单的路径是什么?
我知道的最简单的方法是p/调用SHGetFolderPath
函数,这很可能是。net框架内部使用来检索Environment.SpecialFolders
值。
这个定义看起来像这样:
[DllImport("shell32.dll"), CharSet = CharSet.Auto]
static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken,
uint dwFlags, [Out] StringBuilder pszPath);
您还需要CSIDL_COMMON_DOCUMENTS
常量。直接从Windows头文件:
const int CSIDL_COMMON_DOCUMENTS = 0x002e;
如果你想强制创建文件夹,如果它不存在,你需要传递CSIDL_FLAG_CREATE
标志。定义如下:
const int CSIDL_FLAG_CREATE = 0x8000;
这样写:
public static string GetCommonDocumentsFolder()
{
StringBuilder sb = new StringBuilder();
int retVal = SHGetFolderPath(IntPtr.Zero,
CSIDL_COMMON_DOCUMENTS | CSIDL_FLAG_CREATE,
IntPtr.Zero,
0,
sb);
Debug.Assert(retVal >= 0); // assert that the function call succeeded
return sb.ToString();
}
仅供您参考,SHGetFolderPath
函数在Windows Vista中已被弃用,而支持SHGetKnownFolderPath
(shell团队只是喜欢改变这些东西)。这个新函数带来了一组新的标识符;它现在使用KNOWNFOLDERID
值而不是CSIDL
值。他们建议所有新应用程序都使用新功能。
但是考虑到你的目标是一个老版本的。net框架,并不想升级,这是一个很好的赌注,你可能不需要调用最新的API函数,要么。: -)
旧的功能在Windows Vista和Windows 7中仍然可以很好地工作,即使它只是作为新功能的一个薄包装在内部实现。如果它在Windows 8中失败,你将不得不隔离你的代码路径,或者最终咬紧牙关升级到最新版本的。net,它会为你处理这一切。