强大的文件管理器






4.13/5 (11投票s)
一个功能强大的纯asp.net文件管理器

引言
在web应用程序中,有时您需要管理文件或允许用户管理他们的文件。这时您需要一个文件管理器,创建一个强大的解决方案非常耗时,但您又没有足够的时间。当我需要它的时候,这就是我工作的故事。我认为如果我编写一个功能强大、易于使用且可移植的文件管理器,我会尽我所能。
要求
任何项目的第一步都是获得我的需求,我需要一个具有以下功能的文件管理器
- 函数式
- 创建新目录
- 创建新的html/文本文件
- 编辑html/文本文件
- 上传文件
- 将文件上传并解压缩到目标目录
- 在服务器上创建存档(zip格式)
- 显示文件/目录列表
- 显示文件的属性
- 删除文件
- 删除目录
- 非功能性
- 纯ASP.net(无需任何配置)
- 可换肤(使用CSS更改)
- 用户友好
- 安全
- 易于安装
使用PFM(Power File Manager)
使用强大的文件管理器(简称PFM)非常易于安装。第一步,将文件和目录复制到您的web应用程序中,然后将bin文件复制到您的bin目录,接下来在您的应用程序中添加PFM的链接。
注意
- PFM管理的默认目录是“其他文件”,但您可以在源代码中更改它(根路径)。
- 如果您想与用户共享他们的目录的PFM,您可以使用您的应用程序管理根路径。
现在您的应用程序有一个PFM。
更改皮肤
要更改PFM的皮肤,您可以进行许多自定义
- 更改“PFMStyle.css”文件中的CSS
- 更改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);
}