我正在为安装程序进行自定义操作。 它必须读取存储在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] 举报,一经查实,本站将立刻删除。