如何在.NET 3.5中获取CSIDL_COMMON_DOCUMENTS的path?

我正在为安装程序进行自定义操作。 它必须读取存储在CSIDL_COMMON_DOCUMENTS的文件以确定安装目录。 (我希望在自定义操作中更改安装目录不会成为问题,但这是一个不同的问题。)

我看到.NET 4将CommonDocuments添加到Environment.SpecialFolder 。 不幸的是,我被困在.NET 3.5中。 接下来最简单的方法是什么?

Solutions Collecting From Web of "如何在.NET 3.5中获取CSIDL_COMMON_DOCUMENTS的path?"

我知道的最简单的方法是P /调用SHGetFolderPath函数 ,这很可能是.NET Framework内部用来检索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(); } 

只是为了您的信息,从Windows Vista开始SHGetFolderPath函数已经被弃用,而被SHGetKnownFolderPath (shell团队只是喜欢改变这些东西)。 这个新功能带来了一套新的标识符; 而不是CSIDL值,它现在使用KNOWNFOLDERID值。 他们建议所有新的应用程序使用新功能。

但是考虑到你的目标是老版本的.NET Framework而不想升级,所以很可能你不需要调用最新的API函数。 🙂

旧的在Windows Vista和7中继续工作,即使它在内部仅仅作为新功能的薄包装来实现。 如果在Windows 8中失败了,你将不得不隔离你的代码路径,或者最后咬紧牙关,升级到.NET的最新版本,它将为你处理所有的事情。