.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
[C#] 如何选择一个目录

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

基本思路是利用SHBrowseForFolder 于是有如下代码:

private enum BrowseFlag
{
 BIF_RETURNONLYFSDIRS  = 0x0001,  // For finding a folder to start document searching
 BIF_DONTGOBELOWDOMAIN = 0x0002,  // For starting the Find Computer
 BIF_STATUSTEXT        = 0x0004,
 BIF_RETURNFSANCESTORS = 0x0008,
 BIF_EDITBOX           = 0x0010,
 BIF_VALIDATE          = 0x0020,   // insist on valid result (or CANCEL)

 BIF_BROWSEFORCOMPUTER = 0x1000,  // Browsing for Computers.
 BIF_BROWSEFORPRINTER  = 0x2000,  // Browsing for Printers
 BIF_BROWSEINCLUDEFILES= 0x4000   // Browsing for Everything
}

[StructLayout(LayoutKind.Sequential)]
private struct BrowseInfo
{
 public IntPtr hwndOwner;
 public IntPtr pidlRoot;
 [MarshalAs(UnmanagedType.LPTStr)]
 public string displayname;
 [MarshalAs(UnmanagedType.LPTStr)]
 public string title;
 public int flags;
 public IntPtr callback;
 public IntPtr lparam;
}

[DllImport("shell32.dll", CharSet=CharSet.Auto)]
static extern IntPtr SHBrowseForFolder(ref BrowseInfo info);
[DllImport("shell32.dll", CharSet=CharSet.Auto)]
[return : MarshalAs(UnmanagedType.Bool)]
internal extern static bool SHGetPathFromIDList(IntPtr pidl, [MarshalAs(UnmanagedType.LPTStr)] System.Text.StringBuilder pszPath);

public static string BrowseFolder(IWin32Window owner)
{
 BrowseInfo info = new BrowseInfo();
 info.flags = (int)BrowseFlag.BIF_RETURNONLYFSDIRS
     + (int)BrowseFlag.BIF_STATUSTEXT
     + (int)BrowseFlag.BIF_VALIDATE;
 info.hwndOwner = owner.Handle;
 IntPtr pidlReturned = SHBrowseForFolder(ref info);

 StringBuilder sb = new StringBuilder(260);
 SHGetPathFromIDList(pidlReturned, sb);

 return sb.ToString();
}


这绝对是最简便的解决办法。虽然没有释放pidlReturned有可能造成少量内存泄漏,但是那么一点内存,谁在乎呢?




相关文章

相关软件