如何在.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困住了。下一条最简单的路径是什么?

如何在.net 3.5中获得CSIDL_COMMON_DOCUMENTS的路径

我知道的最简单的方法是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,它会为你处理这一切。