-1

伙计们,在尝试实现一个类来枚举文件系统树的方式后,我放弃了尝试使其工作。

我有一个带有文件路径的文本框。我希望用户能够单击并从显示文件系统树的面板中单击并选择路径。

你们能帮我解决这个问题吗?

只是为了让您了解我在做什么,这是代码:

try
{
    DriveInfo[] allDrives = DriveInfo.GetDrives();

    Response.Write("<ul class=\"jqueryFileTree\" style=\"display: none;\">\n");

    foreach (DriveInfo drive in allDrives)
    {
        if (drive.IsReady == true)
        {
            try
            {
                Response.Write("\t<li class=\"drive collapsed\"><a href=\"#\" rel=\"" + drive.ToString() + "\">" + drive.ToString() + "</a>\n");

                System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(drive.ToString());
                DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.AllDirectories);

                Response.Write("<ul>");

                foreach (System.IO.DirectoryInfo di_child in directories)
                {
                    Response.Write("\t<li class=\"directory collapsed\"><a href=\"#\" rel=\"" + drive + di_child.Name + "/\">" + di_child.Name + "</a>\n");
                    Response.Write("<ul>");

                    foreach (System.IO.FileInfo fi in di.GetFiles())
                    {
                        string ext = "";
                        if (fi.Extension.Length > 1)
                        {
                            ext = fi.Extension.Substring(1).ToLower();
                        }

                        Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + drive + fi.Name + "\">" + fi.Name + "</a></li>\n");
                    }
                    Response.Write("</ul></li>");
                }
                Response.Write("</ul></li>");
            }
            catch (UnauthorizedAccessException e)
            {
                Response.Write(e.Message);
                continue;
            }
            catch (System.IO.DirectoryNotFoundException e)
            {
                Response.Write(e.Message);
                continue;
            }
            catch (Exception e)
            {
                Response.Write(e.Message);
                continue;
            }
        }
    }

    Response.Write("</ul>");
}
catch (Exception)
{
    throw;
}   
4

2 回答 2

1

jqueryFileTree的文档解释说,您需要有一个函数,该函数采用名为 POST 的参数dir,并且您的页面应返回表单的无序列表 ( ul):

<ul class="jqueryFileTree" style="display: none;">
    <li class="directory collapsed"><a href="#" rel="/this/folder/">Folder Name</a></li>
    (additional folders here)
    <li class="file ext_txt"><a href="#" rel="/this/folder/filename.txt">filename.txt</a></li>
    (additional files here)
</ul>

如果您按照这些说明进行操作,您基本上需要 2 个页面:一个完全专用于生成上述输出,另一个页面用于托管jQueryFileTree插件所需的 jQuery 库。

因此,例如,您需要一个Default.aspx带有类似于此的标记:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
     <script src="http://labs.abeautifulsite.net/archived/jquery-fileTree/demo/jquery.js" type="text/javascript"></script>
    <script src="http://labs.abeautifulsite.net/archived/jquery-fileTree/demo/jquery.easing.js" type="text/javascript"></script>
    <script src="http://labs.abeautifulsite.net/archived/jquery-fileTree/demo/jqueryFileTree.js" type="text/javascript"></script>
    <link href="http://labs.abeautifulsite.net/archived/jquery-fileTree/demo/jqueryFileTree.css" rel="stylesheet" type="text/css" media="screen" />
    <script type="text/javascript">
        $(document).ready(function () {
            $.post('FileTree.aspx',{dir:'c:\\'}, function (data) {
                $('#filetree').html(data);
                $('.jqueryFileTree').fileTree({ root:'/' ,script: 'FileTree.aspx' }, function (file) {
                    alert(file);
                });
            });
        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div id="filetree">

    </div>
    </form>
</body>
</html>

在哪里document.ready,您向名为的页面发送post请求,该页面FileTree.aspx实际上将具有代码以生成所需的ul>li正确样式的目录和文件。

FileTree.aspx页面应该是完全空的,但后面的代码应该是这样的:

protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Params["dir"] != null)
        {
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(Path.Combine("c:\\", Request.Params["dir"]));
            if (di.Exists)
            {
                DirectoryInfo[] directories = di.GetDirectories("*.*", SearchOption.TopDirectoryOnly);
                Response.Write("<ul class=\"jqueryFileTree\" >\n");
                //Itera sobre os subdiretórios de cada driver
                foreach (System.IO.DirectoryInfo di_child in directories)
                {
                    Response.Write("\t<li class=\"directory collapsed\"><a href=\"#\" rel=\"" + di_child.Name + "/\">" + di_child.Name + "</a>\n");
                }
                foreach (System.IO.FileInfo fi in di.GetFiles())
                {
                    string ext = "";
                    if (fi.Extension.Length > 1)
                    {
                        ext = fi.Extension.Substring(1).ToLower();
                    }

                    Response.Write("\t<li class=\"file ext_" + ext + "\"><a href=\"#\" rel=\"" + fi.Name + "\">" + fi.Name + "</a></li>\n");
                }// Arquivos 
                Response.Write("</ul></li>");
            }
        }
    }

所以最终发生的事情是,在加载页面时,您向作为参数传递的根文件夹(在我的示例中)Default.aspx发送一个 ajax 请求,并在进一步单击呈现的任何文件夹时,将继续发送 ajax 发布请求到选择目录名称。FileTree.aspxc:\\jQueryFileTreeFileTree.aspx

在我的特定实现中,产生的输出如下:

在此处输入图像描述

现在,请记住,上述代码只有在您的 Web 应用程序在具有足够权限来读取文件系统的用户下运行时才有效,默认情况下并非如此。您需要为此配置 IIS。

另外,请注意,上面的代码是从您的原始版本中大量修改的。我这样做是因为您试图加载整个文件系统,这是一个非常长的、非常冗长的操作。您通常希望加载顶级目录,并且仅在单击每个目录时才尝试加载其内容。不要尝试一次加载所有内容,否则没有人愿意使用您的应用程序。

无论如何,我希望这能为你指明正确的方向......

于 2012-11-27T21:08:06.537 回答
0

为什么不使用现有的解决方案之一: http ://www.ajaxline.com/best-javascript-tree-widgets ?

于 2012-11-27T20:39:29.830 回答