通过调用WinApi打开Windows浏览文件夹.
调用方法:
DirectorySelect dir = new DirectorySelect();
string filePath = dir.GetDirectory();
string filePath = dir.GetDirectory();
源码:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace Open.NetExam.Maker
- {
- public class DirectorySelect
- {
- [DllImport("Shell32.Dll", CharSet = CharSet.Auto)]
- private static extern IntPtr SHBrowseForFolder(ref BROWSEINFO lpbi);
- [DllImport("Shell32.DLL")]
- public static extern int SHGetPathFromIDList(IntPtr pidl, StringBuilder Path);
- private static readonly int MAX_PATH = 260;
- private enum BIF_Flags
- {
- BIF_RETURNONLYFSDIRS = 0x0001,
- BIF_DONTGOBELOWDOMAIN = 0x0002,
- BIF_STATUSTEXT = 0x0004,
- BIF_RETURNFSANCESTORS = 0x0008,
- BIF_EDITBOX = 0x0010,
- BIF_VALIDATE = 0x0020,
- BIF_NEWDIALOGSTYLE = 0x0040,
- BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX),
- BIF_BROWSEINCLUDEURLS = 0x0080,
- BIF_UAHINT = 0x0100,
- BIF_NONEWFOLDERBUTTON = 0x0200,
- BIF_NOTRANSLATETARGETS = 0x0400,
- BIF_BROWSEFORCOMPUTER = 0x1000,
- BIF_BROWSEFORPRINTER = 0x2000,
- BIF_BROWSEINCLUDEFILES = 0x4000,
- BIF_SHAREABLE = 0x8000
- };
- private delegate int BrowseCallbackProc(IntPtr hwnd, UInt32 uMsg, UInt32
- lParam, UInt32 lpData);
- [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential,
- CharSet = CharSet.Auto)]
- private struct BROWSEINFO
- {
- public IntPtr hwndOwner;
- public UIntPtr pidlRoot;
- [MarshalAs(UnmanagedType.LPTStr)]
- public String pszDisplayName;
- [MarshalAs(UnmanagedType.LPTStr)]
- public String lpszTitle;
- [MarshalAs(UnmanagedType.U4)]
- public BIF_Flags ulFlags;
- [MarshalAs(UnmanagedType.FunctionPtr)]
- public BrowseCallbackProc lpfn;
- [MarshalAs(UnmanagedType.U4)]
- public UInt32 lParam;
- public Int32 iImage;
- }
- /// <summary>
- /// 选择目录对话框
- /// </summary>
- /// <returns>返回选择的目录路径</returns>
- public string GetDirectory()
- {
- BROWSEINFO bi = new BROWSEINFO();
- IntPtr pidlRet = IntPtr.Zero;
- pidlRet = SHBrowseForFolder(ref bi);
- if (pidlRet == IntPtr.Zero)
- {
- return string.Empty;
- }
- StringBuilder sb = new StringBuilder(MAX_PATH);
- if (0 == SHGetPathFromIDList(pidlRet, sb))
- {
- return string.Empty;
- }
- return sb.ToString();
- }
- }
- }