65.9K
CodeProject 正在变化。 阅读更多。
Home

通过目录或 HTTP 浏览,使用 ASP.NET

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.40/5 (8投票s)

2004 年 7 月 15 日

2分钟阅读

viewsIcon

72494

downloadIcon

1793

一篇关于通过目录或 HTTP 浏览,使用 ASP.NET 的文章。

Sample Image - Browsing.gif

引言

这个示例项目允许用户通过 Web 浏览目录。 使用此代码,您可以通过 UNC 路径或 HTTP 目录浏览来浏览这些目录。 示例

  • UNC 路径 - c:\\\server\share
  • HTTP 目录浏览 - http://server/directory

使用代码

创建一个名为 Browsing 的 C# Web 应用程序 - 然后将 zip 文件中的文件放入该文件夹中。 有 2 个帮助程序类完成所有工作,这些类可以被移除到它们自己的文件中,应该被应用为业务层。 所有代码都保持干净,并用 #regions 分隔。

代码块说明

客户端 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 日。

© . All rights reserved.