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

强大的文件管理器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (11投票s)

2008年6月11日

CPOL

4分钟阅读

viewsIcon

56981

downloadIcon

3792

一个功能强大的纯asp.net文件管理器

引言

在web应用程序中,有时您需要管理文件或允许用户管理他们的文件。这时您需要一个文件管理器,创建一个强大的解决方案非常耗时,但您又没有足够的时间。当我需要它的时候,这就是我工作的故事。我认为如果我编写一个功能强大、易于使用且可移植的文件管理器,我会尽我所能。

要求

任何项目的第一步都是获得我的需求,我需要一个具有以下功能的文件管理器

  • 函数式
  1. 创建新目录
  2. 创建新的html/文本文件
  3. 编辑html/文本文件
  4. 上传文件
  5. 将文件上传并解压缩到目标目录
  6. 在服务器上创建存档(zip格式)
  7. 显示文件/目录列表
  8. 显示文件的属性
  9. 删除文件
  10. 删除目录
  • 非功能性
  1. 纯ASP.net(无需任何配置)
  2. 可换肤(使用CSS更改)
  3. 用户友好
  4. 安全
  5. 易于安装

使用PFM(Power File Manager)

使用强大的文件管理器(简称PFM)非常易于安装。第一步,将文件和目录复制到您的web应用程序中,然后将bin文件复制到您的bin目录,接下来在您的应用程序中添加PFM的链接。

注意
  1. PFM管理的默认目录是“其他文件”,但您可以在源代码中更改它(根路径)。
  2. 如果您想与用户共享他们的目录的PFM,您可以使用您的应用程序管理根路径。

现在您的应用程序有一个PFM。

更改皮肤

要更改PFM的皮肤,您可以进行许多自定义

  1. 更改“PFMStyle.css”文件中的CSS
  2. 更改Softimages中的图像

编辑/创建HTML文件

PFM使用MCE_tiny编辑器来创建/编辑HTML文件。这是一个强大的编辑器,您可以用任何与asp.net兼容的HTML编辑器替换它,但这并非限制。

如何管理用户使用(安全性)

这在PFM上很简单,因为PFM具有简单的结构,您可以通过对代码进行少量更改来控制它,例如,如果您需要更改用户权限以避免删除文件,您可以隐藏命令行中的删除文件等等。

这很简单,但本文中的PFM对用户没有任何控制,它是PFM的示例。为了使其符合您的兴趣,您应该更改它。

多用户使用的警告

如果您想将其用于多用户,则必须更改选择方法。建议您可以使用cookie。

创建/打开存档

为了创建或打开存档,我使用了“ICSharpCode.SharpZipLib”库。这个API很酷,并且易于使用ZIP存档(在GNU下)。

代码表示

表格解决方案

我的显示文件列表的解决方案使用了ASP表格,但是如果您了解asp表格,这非常简单。为此,我编写了三个类来包装和轻松使用。

public class MyTableCell:TableCell //Describe new Table Cell  
public class MyLinkButton:Label  //Describe Link button (text + image)
public class MyImageButton:Label  //Describe Image button

现在所有东西都准备好了,可以创建文件和目录列表了

        string p = Server.MapPath(startpath);
        if (!Directory.Exists(p))
        {
            MultiView1.SetActiveView(View2);
            return;
        }
        string[] fns = Directory.GetFiles(p);
        string[] dns = Directory.GetDirectories(p);
        string uplevel = startpath;
        if (uplevel.LastIndexOf("\\") > 0)
            uplevel = uplevel.Substring(0, uplevel.LastIndexOf("\\"));
        Table1.Rows.Clear();
        Table1.CssClass = "ms-list8-main";
        TableRow tr = new TableRow();
        MyTableCell head = new MyTableCell("ms-list8-top", new MyImageButton("softimages/folder_home.png", "Default.aspx?goto=listview", "Root")
            , new MyImageButton("softimages/back.png", "Default.aspx?goto=listview&start=" + uplevel, "Back")
            , new MyImageButton("softimages/top.png", "Default.aspx?goto=Upload&start=" + startpath, "Upload File")
            , new MyImageButton("softimages/newfolder.png", "Default.aspx?goto=newFolder&start=" + startpath, "New Folder")
            , new MyImageButton("softimages/mimetype/html.png", "Default.aspx?goto=addnew2&start=" + startpath, "New Text File")
            , new MyImageButton("softimages/ark.png", "Default.aspx?goto=zip&start=" + startpath, "Archive")
            , new MyImageButton("softimages/reloadark.png", "Default.aspx?goto=ReloadZip&start=" + startpath, "Clear Archive")            
            , new MyImageButton("softimages/delark.png", "Default.aspx?goto=DeletArch&start=" + startpath, "Delete Archive"));
        head.ColumnSpan = 5;
        tr.Cells.Add(head);
        Table1.Rows.Add(tr);
        tr = new TableRow();
        tr.Cells.AddRange(new TableCell[] {new MyTableCell("File Name","ms-list8-tl"),new MyTableCell("Size","ms-list8-top")
            ,new MyTableCell("Creation Time","ms-list8-top"),
         new MyTableCell("Last write time","ms-list8-top") ,new MyTableCell("Commands","ms-list8-top")});
        Table1.Rows.Add(tr);
        PrintList(dns, false);
        PrintList(fns, true);
        tr = new TableRow();
        MyTableCell mtc = new MyTableCell(" ", "ms-list8-bottom");
        mtc.ColumnSpan = 5;
        tr.Cells.Add(mtc);
        Table1.Rows.Add(tr);
        MultiView1.SetActiveView(View2);

首先,我们清除所有表格单元格

        Table1.Rows.Clear();
        Table1.CssClass = "ms-list8-main";

现在创建新的表格行

TableRow tr = new TableRow();

因此,为命令按钮栏创建新的表格单元格

MyTableCell head = new MyTableCell("ms-list8-top", new MyImageButton("softimages/folder_home.png",
           "Default.aspx?goto=listview", "Root"), new MyImageButton("softimages/back.png",
           "Default.aspx?goto=listview&start=" + uplevel, "Back"),new MyImageButton("softimages/top.png",
           "Default.aspx?goto=Upload&start=" + startpath, "Upload File"),
           new MyImageButton("softimages/newfolder.png", "Default.aspx?goto=newFolder&start=" +
           startpath,"New Folder"), new MyImageButton("softimages/mimetype/html.png", 
           "Default.aspx?goto=addnew2&start=" + startpath, "New Text File")
            , new MyImageButton("softimages/ark.png", "Default.aspx?goto=zip&start=" + startpath, "Archive")
            , new MyImageButton("softimages/reloadark.png", "Default.aspx?goto=ReloadZip&start=" + 
             startpath, "Clear Archive"), new MyImageButton("softimages/delark.png", 
            "Default.aspx?goto=DeletArch&start=" + startpath, "Delete Archive"));
         head.ColumnSpan = 5;

将列跨度设置为5以平衡表格。在此之后,将标题添加到表格行和表格

   tr.Cells.Add(head);
   Table1.Rows.Add(tr);

现在我们必须为每个单元格的标题创建新行

tr = new TableRow();
        tr.Cells.AddRange(new TableCell[] {new MyTableCell("File Name","ms-list8-tl"),new
                           MyTableCell("Size","ms-list8-top"),new MyTableCell("Creation Time",
                                       "ms-list8-top"),new MyTableCell("Last write time","ms-list8-top") 
                          ,new MyTableCell("Commands","ms-list8-top")});
        Table1.Rows.Add(tr);

此时,我们拥有带有命令栏和标题栏的表格,并且可以添加目录和文件的列表

   PrintList(dns, false);  // dns is list of directories name 
   PrintList(fns, true);   // fns is list of files name

打印列表是一个带有两个参数的程序,用于在表格中显示列表

   private void PrintList(string[] fns, bool isfiles)

创建列表的其他源代码非常简单,不需要任何其他注释。

多视图解决方案

在这个项目中,我们有很多页面需要创建、删除、重命名等等……另一方面,我们必须在一个页面中创建项目,因为它必须是可移植的,在这种情况下,我的解决这个问题的想法是使用多视图解决方案。
多视图是ASP.net工具,用于在一个页面中创建多个页面。

查询处理解决方案

当我们使用多视图时,如何处理视图或用户命令?
要回答这个问题,我们有两个选择
事件处理或查询处理 (QH)
事件处理在另一方面QH非常灵活方面不是很灵活。
QH是一个古老但非常强大的解决方案。
所以,答案是QH。

if (!IsPostBack)
        {
            string w = Request["goto"];
            if (w == null)
                ViewList();
            else
            {
                switch (w)
                {
                    case "addnew":
                        MultiView1.SetActiveView(View1);
                        Label4.Text = "Create Text File";                        
                        TextBox1.ReadOnly = false;
                        Button7.Visible = false;
                        break;
                    case "addnew2":
                        MultiView1.SetActiveView(View1);
                        Label4.Text = "Create Text File";                        
                        TextBox1.ReadOnly = false;
                        Button7.Visible = true;
                        break;
                    case "listview":
                        ViewList();
                        break;
                    case "edit":
                        editThisfile();
                        break;
                    case "ren":
                        renamethisfile();
                        break;
                    case "del":
                        deleteThisfile();
                        break;
                    case "info":
                        information();
                        break;
                    case "link":
                        showlink();
                        break;
                    case "newFolder":
                        MultiView1.SetActiveView(View7);
                        break;
                    case "Upload":
                        MultiView1.SetActiveView(View8);
                        break;
                    case "zip":
                        CreateZip();
                        break;
                    case "AddZip":
                        AddtoZip();
                        break;
                    case "RemoveZip":
                        RemoveZip();
                        break;
                    case "ReloadZip":
                        ReloadZip();
                        break;
                    case "DeletArch":
                        DeletArch();
                        break;
                    default:
                        break;
                }
            }
        }

监控错误

如果您有一个很棒的项目,您将遇到巨大的错误!为了解决这个问题,您必须监控您的错误并在用户使用您的应用程序时保存它们。沃森博士是一个记录任何事件的人。所以现在我们有一个带有这个标题的类。
DrWatson(我们的类)只是将抛出的异常写入名为“DrWatson.txt”的文本文件中,其中包含日期/时间和抛出源。

catch (Exception ex)
        {
            DrWatson.SaveError(ex);
        }
© . All rights reserved.