写在前
之前写了一篇关于 文件夹与文件的操作的文章 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )
把常用的对于文件与文件夹的操作总结了一下,在文章的回复中有提到 遗漏的方法,并建议做一个文档管理工具 ,一细想是可以啊,之后就开始构思,最后大至需求如下,
因为都是下班后在家中花时间做的,时间有点短,有BUG是正常的,希望大家谅解,再一个对windows的文件权限,几乎是0接触所以把权限处理留到了后期,如果大家有关于文件夹权限处理的好文章,希望大家给我留言,好的东西需要分享,本篇会写一下几个功能点的思路与做法,算是对自己的总结,如果对本项目有兴趣的朋友请 狂点这里
最后如果您觉得,有什么地方做得不够好,或者您有什么建议 与 意见 请一定要指出! 在此非常感谢!
一 工具功能点
一 展示
1 以树形展示单个磁盘内所有文件夹子文件夹,与文件名
2 支持子文件夹的层级展开
3 右侧支持文本文档的预览(二期)
4 若是图片支持预览(二期)
二 操作
1 支持指定目录下的文件夹新增,(右键)
2 支持指定目录下的文件夹删除(右键)
3 支持指定目录下的文件夹,与文件的重命名((右键))
4 支持指定目录下的文件夹与文件移动到另一指定的文件夹(托拽)
5 支持指定目录下的文件夹批量删除
6 支持指定目录下的文件搜索 (只要文件名匹配即可)(二期)
7 文件夹与文件的访问权限处理
以上就是大至简单的需求,然后根据需求,选择了以下几个小插件
zTree:树形插件 个人觉得很不错,国内的插件,API文档解释很详细,至少我从来没用过树形插件的,比较容易的就上手了。 zTree插件地址
Layer:弹出层插件,使用简单,效果好,拿来即用 Layer插件地址
二 工具基本介绍
先上几张图 新建文件夹,文件夹或文件重命名
删除文件或文件夹(支持批量删除)
以拖拽形式批量移动文件夹
三 功能实现讲解
3.1 加载文件夹树
根据zTree需要的参数配置就行了,具体参数请大家看zTree的API吧,着重写一下加载时遇到的坑
实现思路:遍历指定路径下第一层所有文件夹与文件并组成对象序列化成Json并返回Json数据给zTree绑定
刚开始想着一次性把所有的文件与文件夹都加载出来,然后用递归实现,但是因为我定义了一个类来保存文件的信息,而且是以嵌套的形式存的,这样的做法初看觉得
很有层次感到写递归时,却把自己坑了,也主要是以前没认真写过递归,导致这一方法纠结了一个晚上再加上午的一点时间,终于递归出来了,
然后一试验,浏览器直接死了,数量太大嵌套的太深,加载一次至少要40秒以上,于是果断放弃了,改为每次只加载一层
以下为保存数据的类,与加载的方法 , 这里只列出部分代码,具体代码在源码中都可找到
类设计
1 public class zTreeModel 2 { 3 public zTreeModel() 4 { 5 _isPrent = false; 6 _children = new List<zTreeModel>(); 7 } 8 9 private bool _isPrent ; 10 private List<zTreeModel> _children = null; 11 12 /// <summary> 13 ///根结点名字 14 /// </summary> 15 public string rootFullName { get; set; } 16 17 /// <summary> 18 /// 父结点名称 19 /// </summary> 20 public string pName { get; set; } 21 /// <summary> 22 /// 父结点全路径名称 23 /// </summary> 24 public string pFullName { get; set; } 25 26 /// <summary> 27 /// 当前结点全路径名称 28 /// </summary> 29 public string fullName { get; set; } 30 31 /// <summary> 32 /// 当前结点名称 33 /// </summary> 34 public string name { get; set; } 35 36 /// <summary> 37 /// 是否为父结点 38 /// </summary> 39 public bool isParent { 40 get { return _isPrent; } 41 set { _isPrent = value; } 42 } 43 /// <summary> 44 /// 是否为顶层节点 45 /// </summary> 46 public bool topNode { get; set; } 47 48 /// <summary> 49 /// 是否为文件 默认为False 50 /// </summary> 51 public bool isFile { get; set; } 52 53 /// <summary> 54 /// 是否打开 55 /// </summary> 56 public bool open { get; set; } 57 58 /// <summary> 59 /// 子结点 60 /// </summary> 61 public List<zTreeModel> children 62 { 63 get { return _children; } 64 set { _children = value; } 65 } 66 }
JavaScript
1 var zTreeObj, 2 setting = { 3 view: { 4 selectedMulti: true, 5 showLine: true 6 }, 7 edit: { 8 drag: { 9 isMove: true, 10 inner:true//拖拽后为同级节点, 11 },//托拽操作配置 12 enable: true,//节点可编辑 13 showRemoveBtn: false, 14 showRenameBtn: false, 15 editNameSelectAll: true 16 }, 17 data: { 18 keep: { 19 parent:true //删除子节点后父节点不变为叶子节点 20 }, 21 22 }, 23 async: { 24 enable: true, 25 autoParam:["fullName"], 26 url: "/FileManager/GetSingleLevelNodes", 27 type: "POST", 28 29 }, 30 treeNode: { 31 checked:true 32 33 }, 34 callback: 35 { 36 // beforeExpand: zTreeBeforeExpand,//展开节点前的回调方法 37 38 beforeRename: zTreeBeforeRename,//重命名之前的回调方法 39 onRename: zTreeOnRename,//重命名 40 41 beforeRemove: zTreeBeforeRemove,//删除前回调方法 42 onRemove: zTreeRemove,//删除 43 44 beforeRightClick: zTreeBeforeRightClick,//右键方法前的回调 45 onRightClick: zTreeOnRightClick,//右键方法 46 47 beforeDrop: zTreeBeforeDrop,//用于捕获节点拖拽操作结束之前的事件回调函数,并且根据返回值确定是否允许此拖拽操作.如果返回 false,zTree 将恢复被拖拽的节点,也无法触发 onDrop 事件回调函数 48 onDrop: zTreeOnDrop,//拖拽操作结束的事件 49 beforeDrag: zTreeBeforeDrag//托拽前的方法 50 51 } 52 }; 53 54 var zTreeNodes = ""; 55 $(function () { 56 ReLoadTree(); 57 }); 58 59 function ReLoadTree() { 60 $.ajax({ 61 url: "/FileManager/GetDefaultFiles", 62 type: "POST", 63 async: false, 64 dataType: "json", 65 success: function (data) { 66 zTreeNodes = data; 67 } 68 }); 69 zTreeObj = $.fn.zTree.init($("#tree"), setting, zTreeNodes); 70 71 }
C#
1 public List<zTreeModel> GetDefaultFiles(string path) 2 { 3 zTreeModel treeModel = null; 4 List<zTreeModel> treeModelList = new List<zTreeModel>(); 5 if (Directory.Exists(path)) 6 { 7 //获取子目录 8 DirectoryInfo directory = new DirectoryInfo(path); 9 10 try 11 { 12 var folders = directory.GetDirectories(); 13 //遍历路径下文件夹 14 foreach (var folder in folders) 15 { 16 treeModel = new zTreeModel(); 17 treeModel.pName = folder.Parent == null ? " " : folder.Parent.Name; 18 treeModel.pFullName = folder.Parent == null ? " " : folder.Parent.FullName; 19 treeModel.rootFullName = folder.Root.FullName; 20 treeModel.name = folder.Name; 21 treeModel.fullName = folder.FullName; 22 treeModel.isParent = true; 23 treeModelList.Add(treeModel); 24 } 25 26 } 27 catch (UnauthorizedAccessException ex)//调用方没有所要求的权限。 28 { 29 return null; 30 } 31 32 //获取路径下文件 33 DirectoryInfo fileDirectory = new DirectoryInfo(path); 34 35 try 36 { 37 var files = fileDirectory.GetFiles(); 38 foreach (var file in files) 39 { 40 treeModel = new zTreeModel(); 41 treeModel.pName = file.Directory == null ? "" : file.Directory.Name; 42 treeModel.pFullName = file.DirectoryName; 43 treeModel.rootFullName = file.Directory == null ? "" : file.Directory.Root.FullName; 44 treeModel.name = file.Name; 45 treeModel.fullName = file.FullName; 46 treeModel.isFile = true; 47 treeModelList.Add((treeModel)); 48 } 49 50 } 51 catch (UnauthorizedAccessException ex) //调用方没有所要求的权限。 52 { 53 return null; 54 } 55 } 56 57 return treeModelList; 58 59 }