微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

检查另一个进程在.NET中是否具有pipe理员权限

HTTP请求未经客户authenticationscheme“Ntlm”

如何从本地应用程序获取窗口打开/closures/最小化消息?

更改系统语言C#

用Winforms绘图

我知道的最简单的方法是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,sb); Debug.Assert(retVal >= 0); // assert that the function call succeeded return sb.ToString(); }

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐