IIS 5.0IIS 5.1IIS 6.0Visual Studio .NET 2002.NET 1.0IISVisual Studio .NET 2003.NET 1.1IntermediateDevVisual StudioWindows.NETASP.NETC#
通过目录或 HTTP 浏览,使用 ASP.NET






3.40/5 (8投票s)
2004 年 7 月 15 日
2分钟阅读

72494

1793
一篇关于通过目录或 HTTP 浏览,使用 ASP.NET 的文章。
引言
这个示例项目允许用户通过 Web 浏览目录。 使用此代码,您可以通过 UNC 路径或 HTTP 目录浏览来浏览这些目录。 示例
- UNC 路径 - c:\ 或 \\server\share
- HTTP 目录浏览 - http://server/directory
使用代码
创建一个名为 Browsing 的 C# Web 应用程序 - 然后将 zip 文件中的文件放入该文件夹中。 有 2 个帮助程序类完成所有工作,这些类可以被移除到它们自己的文件中,应该被应用为业务层。 所有代码都保持干净,并用 #region
s 分隔。
代码块说明
客户端 JavaScript
我使用的列表框实际上是一个带边框的 DIV
,看起来像一个列表框。 自定义列表框中可以包含图像和文本,以及任何其他 HTML - 这是常规 HTML 下拉菜单不允许的。 以下两个 JavaScript 函数在单击或双击某一行时被调用。
单击时,当调用 HighLight()
方法时,该行被突出显示。 双击时,该行被突出显示,并向服务器发送请求以使用 DoBrowse()
方法更新目录。
<script language="javascript">
function DoBrowse(obj, objectName, isDirectory)
{
HighLight(obj, objectName);
if (isDirectory)
{
Form1._actionHidden.value = 'RefreshBrowse';
}
else
{
Form1._actionHidden.value = 'OpenFile';
}
Form1._clickedObjectHidden.value = objectName;
Form1.submit();
}
function HighLight(obj, objectName)
{
var objs = document.all;
for (var i=0; i<objs.length; i++)
{
if (objs[i].className == 'hilite')
{
objs[i].className = 'nohilite';
}
}
obj.className = 'hilite';
}
</script>
ASP.NET 代码
在回发时,我想触发一个动作 - 就像一个事件 - 但我没有一个事件驱动的对象。 所以我创建了这个 _actionHidden.Value
,它由上面的 JavaScript 设置,并通过 DoAction()
方法运行。
private void Page_Load(object sender, System.EventArgs e)
{
if(IsPostBack)
DoAction();
}
private void DoAction()
{
switch (_actionHidden.Value)
{
case "RefreshBrowse" :
_browseButton_Click(this, null);
break;
case "OpenFile" :
OpenFile();
break;
}
_actionHidden.Value = "";
}
在回发时使用我自己的 HTML 表填充列表框
private void _browseButton_Click(object sender,
System.Web.UI.ImageClickEventArgs e)
{
if (0 != _browseTextBox.Text.Length)
{
UpdateBrowseTextBoxWithSlash();
_browseTextBox.Text += _clickedObjectHidden.Value;
_clickedObjectHidden.Value = "";
FileList fileList = new FileList(_browseTextBox.Text, "*.*");
Table tb = new Table();
TableRow tr;
TableCell td;
tb.Width = Unit.Percentage(100);
tb.BorderWidth = 0;
tb.CellSpacing = 0;
tb.CellPadding = 4;
foreach (string directory in fileList.Directories)
{
tr = new TableRow();
td = new TableCell();
td.Width = Unit.Percentage(100);
td.CssClass = "nohilite";
System.Web.UI.WebControls.Image directoryImage =
new System.Web.UI.WebControls.Image();
directoryImage.ImageUrl = "Images/folder.gif";
directoryImage.BorderWidth = 0;
directoryImage.ImageAlign = ImageAlign.AbsMiddle;
td.Attributes.Add("onDblClick",
string.Format("DoBrowse(this, '{0}',
true)", directory));
td.Attributes.Add("onClick", "HighLight(this, '')");
td.Controls.Add(directoryImage);
td.Controls.Add(new
LiteralControl("<SPAN class='\"text\"'> "
+ directory + ""));
tr.Cells.Add(td);
tb.Rows.Add(tr);
}
foreach (string file in fileList.Files)
{
tr = new TableRow();
td = new TableCell();
td.Width = Unit.Percentage(100);
td.CssClass = "nohilite";
td.Attributes.Add("onDblClick",
string.Format("DoBrowse(this, '{0}',
false)", file));
td.Attributes.Add("onClick", "HighLight(this, '')");
System.Web.UI.WebControls.Image fileImage =
new System.Web.UI.WebControls.Image();
fileImage.ImageAlign = ImageAlign.AbsMiddle;
fileImage.ImageUrl = "Images/file.gif";
td.Controls.Add(fileImage);
td.Controls.Add(new
LiteralControl("<SPAN class='\"text\"'> " +
file + ""));
tr.Cells.Add(td);
tb.Rows.Add(tr);
}
_browsePlaceholder.Controls.Add(tb);
}
}
帮助类 - FileList
完成获取目录和文件 ArrayList
的实际工作。
protected void ParseHTTPPage ( string directory, string filter)
{
try
{
string[] filterlist = filter.Split(';');
if (!FileList.IsHTMLContent(directory))
directory = GetPath(directory);
string uristring = ExtractUrifromUrl(directory);
WebClient client = new WebClient();
byte[] pagedata = client.DownloadData(directory);
string[] hrefs = ExtractHrefsFromPage(pagedata);
ArrayList dirs = new ArrayList();
ArrayList files = new ArrayList();
foreach (string uri in hrefs)
{
if (uri.EndsWith("/"))
{
// handle the directory
if (uri.StartsWith(uristring))
dirs.Add(uri.Substring(uristring.Length).Trim('/'));
}
else
{
string file = Path.GetFileName(uri);
foreach (string query in filterlist)
{
if (System.Text.RegularExpressions.Regex.IsMatch(file,
"." + query.Replace(".", "\\."),
RegexOptions.IgnoreCase))
{
files.Add(file);
break;
}
}
}
}
_directories = new string[dirs.Count];
dirs.CopyTo(_directories);
System.Array.Sort(_directories);
_files = new string[files.Count];
files.CopyTo(_files);
System.Array.Sort(_files);
_basedirectory = directory;
if (!_basedirectory.EndsWith("/"))
_basedirectory += "/";
}
catch(Exception except)
{
System.Diagnostics.Trace.WriteLine("Exception" +
" parsing URL: " + except.Message);
}
return;
}
protected void PasreUNCPage ( string directory, string filter)
{
try
{
if (FileAttributes.Directory !=
(FileAttributes.Directory &
File.GetAttributes(directory)))
directory = GetPath(directory);
}
catch(Exception)
{
return;
}
try
{
_directories =
RelativePaths( Directory.GetDirectories(directory, "*.*"));
System.Array.Sort(_directories);
}
catch(Exception except)
{
System.Diagnostics.Trace.WriteLine("Exception" +
" parsing directory: " + except.Message);
}
try
{
_files = new string[0];
string[] extensions = filter.Split(';');
foreach (string ext in extensions)
{
string[] foundfiles =
RelativePaths( Directory.GetFiles(directory, ext));
if (foundfiles.Length > 0)
{
string[] newlist = new string[_files.Length
+ foundfiles.Length];
_files.CopyTo(newlist, 0);
foundfiles.CopyTo(newlist, _files.Length);
_files = newlist;
System.Array.Sort(_files);
}
}
}
catch(Exception except)
{
System.Diagnostics.Trace.WriteLine("Exception" +
" parsing files: " + except.Message);
}
_basedirectory = directory;
if (!_basedirectory.EndsWith("\\"))
_basedirectory += "\\";
return;
}
帮助类 - PathHelper
执行任何路径处理函数。
关注点
在此处查看更多代码示例和组件 here。
历史
发布日期:2004 年 7 月 14 日。