当前位置:编程学习 > C#/ASP.NET >>

.Net选择文件夹

OpenFileDialog只能选择文件
FolderBrowserDialog只能选择文件夹
请问怎么既能选择文件夹,又能选择文件 --------------------编程问答-------------------- 你的意思是要在FolderBrowserDialog中也能列出文件? --------------------编程问答-------------------- 你想要这些功能做什么呢? --------------------编程问答-------------------- 最好把想要实现什么说出来,不然有可能走弯路 --------------------编程问答-------------------- 你见过有类似的软件??

应该没有这个功能的,不过可以自己做一个,也不繁琐,网络上太多的目录树可供参考了;


││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤  --------------------编程问答-------------------- 应该不可能吧,若真那样,你那个文件夹里的文件你就选不中了。
你可以建两个button,两个打开文件的按钮,分别为OpenFileDialog和FolderBrowserDialog
--------------------编程问答-------------------- 这样的类应该没有吧 我觉得 --------------------编程问答-------------------- FolderBrowserDialog能否也能选择文件,需要选择文件夹和文件
或者是OpenFileDialog能选择文件夹
再或者有其它方法

说下用于文件或文件夹的复制,选取文件就复制该文件,选择文件夹就复制该文件夹下面的所有文件
既要选择文件,又要选择文件夹的时候应该很多吧,小弟以前学的是Java,公司要做.Net,只好从头学 --------------------编程问答-------------------- 和语言无关的——你看哪一个软件是这样子的? --------------------编程问答--------------------
引用 8 楼 lovingkiss 的回复:
和语言无关的——你看哪一个软件是这样子的?

WINRAR
呵呵 --------------------编程问答-------------------- 我写了一些代码,楼主可以参考下:

使用:

protected override void OnClick(EventArgs e)
{
base.OnClick(e);
BrowserDialog bd = new BrowserDialog();
bd.IncludeFiles = true;
bd.ShowDialog(this);
}


类定义:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security;
using System.Threading;

namespace BrowserDialog
{
public sealed class BrowserDialog : CommonDialog
{
private delegate int BrowseCallbackProc(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, string lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);
 
private static readonly int BFFM_SETSELECTION=0x466;
private static readonly int BIF_BROWSEINCLUDEFILES = 0x4000;
private static readonly int BIF_NONEWFOLDERBUTTON = 0x0200;

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern bool SHGetPathFromIDList(IntPtr pidl, IntPtr pszPath);

[DllImport("shell32.dll")]
private static extern int SHGetSpecialFolderLocation(IntPtr hwnd, int csidl, ref IntPtr ppidl);

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SHBrowseForFolder([In] BROWSEINFO lpbi);
 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private class BROWSEINFO
{
public IntPtr hwndOwner;
public IntPtr pidlRoot;
public IntPtr pszDisplayName;
public string lpszTitle;
public int ulFlags;
public BrowseCallbackProc lpfn;
public IntPtr lParam;
public int iImage;
}

[ComImport, Guid("00000002-0000-0000-c000-000000000046"), SuppressUnmanagedCodeSecurity, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IMalloc
{
[PreserveSig]
IntPtr Alloc(int cb);
[PreserveSig]
IntPtr Realloc(IntPtr pv, int cb);
[PreserveSig]
void Free(IntPtr pv);
[PreserveSig]
int GetSize(IntPtr pv);
[PreserveSig]
int DidAlloc(IntPtr pv);
[PreserveSig]
void HeapMinimize();
}

[DllImport("shell32.dll")]
private static extern int SHGetMalloc([Out, MarshalAs(UnmanagedType.LPArray)] IMalloc[] ppMalloc);
 
private BrowseCallbackProc callback;
private string descriptionText;
private Environment.SpecialFolder rootFolder;
private string selectedPath;
private bool selectedPathNeedsCheck;
private bool showNewFolderButton;
private bool includeFiles;

public BrowserDialog()
{
this.Reset();
}
public string Description
{
get
{
return this.descriptionText;
}
set
{
this.descriptionText = (value == null) ? string.Empty : value;
}
}

public bool IncludeFiles
{
get { return includeFiles; }
set { includeFiles = value; }
}

public Environment.SpecialFolder RootFolder
{
get
{
return this.rootFolder;
}
set
{
if (!Enum.IsDefined(typeof(Environment.SpecialFolder), value))
{
return;
}
this.rootFolder = value;
}
}

public string SelectedPath
{
get
{
if (((this.selectedPath != null) && (this.selectedPath.Length != 0)) && this.selectedPathNeedsCheck)
{
return null;
}
return this.selectedPath;
}
set
{
this.selectedPath = (value == null) ? string.Empty : value;
this.selectedPathNeedsCheck = false;
}
}

public bool ShowNewFolderButton
{
get
{
return this.showNewFolderButton;
}
set
{
this.showNewFolderButton = value;
}
}
private int FolderBrowserDialog_BrowseCallbackProc(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData)
{
switch (msg)
{
case 1:
if (this.selectedPath.Length != 0)
{
SendMessage(new HandleRef(null, hwnd), BFFM_SETSELECTION, 1, this.selectedPath);
}
break;

case 2:
{
IntPtr pidl = lParam;
if (pidl != IntPtr.Zero)
{
IntPtr pszPath = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize));
bool flag = SHGetPathFromIDList(pidl, pszPath);
Marshal.FreeHGlobal(pszPath);
SendMessage(new HandleRef(null, hwnd), 0x465, 0, flag ? 1 : 0);
}
break;
}
}
return 0;
}

public override void Reset()
{
this.rootFolder = Environment.SpecialFolder.Desktop;
this.descriptionText = string.Empty;
this.selectedPath = string.Empty;
this.selectedPathNeedsCheck = false;
this.showNewFolderButton = true;
}
private static IMalloc GetSHMalloc()
{
IMalloc[] ppMalloc = new IMalloc[1];
SHGetMalloc(ppMalloc);
return ppMalloc[0];
}
protected override bool RunDialog(IntPtr hWndOwner)
{
IntPtr zero = IntPtr.Zero;
bool flag = false;
SHGetSpecialFolderLocation(hWndOwner, (int)this.rootFolder, ref zero);
if (zero == IntPtr.Zero)
{
SHGetSpecialFolderLocation(hWndOwner, 0, ref zero);
if (zero == IntPtr.Zero)
{
return false;
}
}
int num = 0x40;
if (!this.showNewFolderButton)
{
num += BIF_NONEWFOLDERBUTTON;
}
if (this.includeFiles)
{
num += BIF_BROWSEINCLUDEFILES;
}
if (Control.CheckForIllegalCrossThreadCalls && (Application.OleRequired() != ApartmentState.STA))
{
return false;
}
IntPtr pidl = IntPtr.Zero;
IntPtr hglobal = IntPtr.Zero;
IntPtr pszPath = IntPtr.Zero;
try
{
BROWSEINFO lpbi = new BROWSEINFO();
hglobal = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize));
pszPath = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize));
this.callback = new BrowseCallbackProc(this.FolderBrowserDialog_BrowseCallbackProc);
lpbi.pidlRoot = zero;
lpbi.hwndOwner = hWndOwner;
lpbi.pszDisplayName = hglobal;
lpbi.lpszTitle = this.descriptionText;
lpbi.ulFlags = num;
lpbi.lpfn = this.callback;
lpbi.lParam = IntPtr.Zero;
lpbi.iImage = 0;
pidl = SHBrowseForFolder(lpbi);
if (pidl != IntPtr.Zero)
{
SHGetPathFromIDList(pidl, pszPath);
this.selectedPathNeedsCheck = true;
this.selectedPath = Marshal.PtrToStringAuto(pszPath);
flag = true;
}
}
finally
{
IMalloc sHMalloc = GetSHMalloc();
sHMalloc.Free(zero);
if (pidl != IntPtr.Zero)
{
sHMalloc.Free(pidl);
}
if (pszPath != IntPtr.Zero)
{
Marshal.FreeHGlobal(pszPath);
}
if (hglobal != IntPtr.Zero)
{
Marshal.FreeHGlobal(hglobal);
}
this.callback = null;
}
return flag;
}
}
}

--------------------编程问答-------------------- FolderBrowserDialog就可以了啦,还要那么复杂做什! --------------------编程问答-------------------- 请问FolderBrowserDialog怎么做可以选择文件 --------------------编程问答--------------------

TreeView就可以 --------------------编程问答--------------------
引用 12 楼 Baby_2007 的回复:
请问FolderBrowserDialog怎么做可以选择文件


有一个很丑陋的对话框可以做倒,但可能不是你要的 --------------------编程问答-------------------- 能用就好,先能达到功能
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,