本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+端口的方式访问目标调用上的所有目录,不错是所有目录(如果您有:C,D,E,F盘都可以访问),当然为了安全最好限制下;还有上传,备份功能,具体看下面的分享内容吧;git地址:
本查看器主要是为了方便大家查看服务器上的日志,这里没有考虑其他安全性问题,比如特定人员登录才能查看,这个需要您们自己去增加;如果你服务器有对外开放了ip,那么运行这个软件的时候建议考虑配置成您们公司内网的ip,这里可以避免一些安全性问题;下面是主要功能:
. 通过可以定义文件配置常用磁盘访问地址
. 查看磁盘目录下的文件夹和文件
. 部分可访问行文件(如:txt,DLL,图片等)可以在浏览器中打开或下载(访问性格式由程序配置)
. 上传多个文件到指定磁盘
. 文件备份(如果上传的文件已经存在,会自动备份到bak文件夹中)
效果gif图片,有点花多多包涵:
效果还可以吧,不妨“推荐”下;
首先,要明确的是在NetCore1.1中api已经和大部分能和framwork对应上了(据@善友一篇博客简单介绍说NetCore2.0的api已经能够和framwork持平了),因此这里我们能够直接使用DirectoryInfo,来查看磁盘路径的文件夹和文件,所以就有了查看列表Action的代码:
1 ///2 /// 磁盘列表 3 /// 4 /// 磁盘路径 5 ///6 public IActionResult Index(string path) 7 { 8 Console.WriteLine($"IP:{HttpContext.Connection.RemoteIpAddress}正在查看磁盘:{path}"); 9 var list = new List ();10 MoSearch moSerach = new MoSearch { Txt1 = path };11 ViewData["Search"] = moSerach;12 13 if (string.IsNullOrWhiteSpace(path)) { return View(list); }14 if (path.StartsWith("c:", StringComparison.OrdinalIgnoreCase)) { this.MsgBox($"无权限访问:{path}"); return View(list); }15 if (!System.IO.Directory.Exists(path)) { this.MsgBox($"磁盘路径:{path}不存在!"); return View(list); }16 DirectoryInfo dic = new DirectoryInfo(path);17 list = dic.GetFileSystemInfos().OrderByDescending(b => b.LastWriteTime).ToList();18 19 return View(list);20 }
这里我默认限制了C盘,并且采用自带的文件对象FileSystemInfo来返回信息,仅仅只需要一段 dic.GetFileSystemInfos().OrderByDescending(b => b.LastWriteTime).ToList() 就能获取按照最新修改时间得到磁盘目录信息;对应的View布局如下:
1 @using System.IO 2 @using ShenNiu.LogTool.Extension; 3 @using ShenNiu.LogTool.Controllers 4 @model List5 @{ 6 ViewData["Title"] = "日志搜索"; 7 8 var moSearch = ViewData["Search"] as MoSearch; 9 } 10 11@ViewData["Title"]
12
13 1415 16 列表页面的常用地址来源有系统配置文件配置的,通过前端ajax调用接口获取配置的json内容,接口Action代码:1 public async TaskGetSelData() 2 { 3 var apiUrl = $"http://{Request.Host.Host}:{Request.Host.Port}/js/tooldata/logconf.json"; 4 var str = string.Empty; 5 using (HttpClient client = new HttpClient()) 6 { 7 client.BaseAddress = new Uri(apiUrl); 8 str = await client.GetStringAsync(apiUrl); 9 }10 return Content(str);11 } 配置文件格式和内容如:
1 [ 2 { 3 "gname": "日志", 4 "gval": [ 5 { 6 "name": "JokeLog", 7 "val": "D:\\D\\Joke" 8 } 9 ]10 },11 {12 "gname": "D盘",13 "gval": [14 {15 "name": "D盘",16 "val": "D:\\"17 }18 ]19 }20 ]
指定磁盘目录上传文件和自动备份
通常咋们有这样的情况,我们没有直接访问服务器的权限,想上传个东西很麻烦,每次只能通过运维(当然这是正规的流程),可是往往一些特殊情况不得不自己传递个东西发布,因此这里增加了上传功能,并且上传时候如果已存在相同文件,那么在覆盖之前会自动增加备份到tempbak中去;
1 ///2 /// 本查看系统具有上传文件的功能 3 /// 4 ///5 [HttpPost] 6 public async Task AjaxFileUp() 7 { 8 var data = new MoData { Msg = "上传失败" }; 9 try10 {11 var upPath = Request.Form["txt1"];12 if (string.IsNullOrWhiteSpace(upPath)) { data.Msg = "请在【磁盘路径】输入框输入上传路径。"; return Json(data); }13 if (!System.IO.Directory.Exists(upPath)) { data.Msg = $"磁盘路径:{upPath}不存在!"; return Json(data); }14 upPath = upPath.ToString().TrimEnd(&#39;\\&#39;);15 16 var files = Request.Form.Files.Where(b => b.Name == "upFile");17 //非空限制18 if (files == null || files.Count() <= 0) { data.Msg = "请选择上传的文件。"; return Json(data); }19 20 //格式限制21 //var allowType = new string[] { "image/jpeg", "image/png" };22 //if (files.Any(b => !allowType.Contains(b.ContentType)))23 //{24 // data.Msg = $"只能上传{string.Join(",", allowType)}格式的文件。";25 // return Json(data);26 //}27 28 //大小限制29 var nMax = 20;30 if (files.Sum(b => b.Length) >= 1024 * 1024 * nMax)31 {32 data.Msg = $"上传文件的总大小只能在{nMax}M以下。"; return Json(data);33 }34 35 //删除过去备份的文件36 var basePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "tempbak");37 DirectoryInfo dic = new DirectoryInfo(basePath);38 var nCount = dic.GetFiles().Count();39 var nMaxCount = 10;40 if (nCount > nMaxCount) //大于nMaxCount个文件清空临时目录41 {42 foreach (var item in dic.GetFiles().OrderBy(b => b.LastWriteTime).Take(nCount - nMaxCount))43 {44 try45 {46 item.Delete();47 }48 catch (Exception ex) { }49 }50 }51 52 //写入服务器磁盘53 var upLog = new StringBuilder(string.Empty);54 foreach (var file in files)55 {56 57 var fileName = file.FileName;58 var path = Path.Combine(upPath, fileName);59 upLog.AppendFormat("文件:{0};", path);60 61 //存在文件需要备份62 if (System.IO.File.Exists(path))63 {64 FileInfo info = new FileInfo(path);65 var tempPath = Path.Combine(basePath, info.Name); //备份目录66 var newInfo = info.CopyTo(tempPath, true);67 if (newInfo == null) { upLog.Append($"备份:失败,请稍后重试!"); }68 else { upLog.Append($"备份:成功!"); }69 }70 71 using (var stream = System.IO.File.Create(path))72 {73 await file.CopyToAsync(stream);74 }75 upLog.Append($"上传:成功;
");76 }77 data.Msg = upLog.ToString();78 data.Status = 2;79 }80 catch (Exception ex)81 {82 data.Msg += ex.Message;83 }84 Console.WriteLine($"IP:{HttpContext.Connection.RemoteIpAddress}正在上传:{data.Msg}");85 return Json(data);86 }关键点的逻辑代码已经有注释了这里就不多说了,主要满足咋们的业务:上传+备份;至于上传的js代码已经在上面的列表试图中了这里就不重复贴出来了;这里用到了几个自定义实体类:
1 ///2 /// 接口统一类 3 /// 4 public class MoData 5 { 6 public string Msg { get; set; } 7 8 public int Status { get; set; } 9 }10 11 ///12 /// 搜索类13 /// 14 public class MoSearch15 {16 public string Txt1 { get; set; }17 18 public string Sel1 { get; set; }19 }20 21 ///22 /// 文件23 /// 24 public class MoFile25 {26 public string Name { get; set; }27 public string Path { get; set; }28 public string Url { get; set; }29 public string Content { get; set; }30 public FileAttributes Attributes { get; set; }31 }
直接查看内容
该系统可以直接查看如:txt,log等后缀的文件,因为这种类型的文件一般都有读,写同时操作的情况,所以这里我采用的方式是先拷贝当前访问的文件到temp临时目录中,然后在读取内容或下载文件;当满足超过10个文件的设置,那么自动删除修改时间最小的文件,避免拷贝文件一直增多导致磁盘空间的成本;下面是读取Action的内容:
1 ///2 /// 查看内容 3 /// 4 /// 5 ///6 public async Task Read(string path) 7 { 8 Console.WriteLine($"IP:{HttpContext.Connection.RemoteIpAddress}正在查看文件:{path}"); 9 10 var moFile = new MoFile { Path = path };11 if (string.IsNullOrWhiteSpace(path)) { this.MsgBox($"文件路径:{path}不存在。"); return View(moFile); }12 if (!System.IO.File.Exists(path)) { this.MsgBox($"文件路径:{path}不存在!"); return View(moFile); }13 14 try15 {16 FileInfo info = new FileInfo(path);17 //if (!ExtensionClass._AllowExtension.Any(b => b.ToUpper() == info.Extension.ToUpper()))18 //{19 // this.MsgBox($"无法访问{info.Extension}的文件"); return View(moFile);20 // }21 22 var basePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "temp");23 DirectoryInfo dic = new DirectoryInfo(basePath);24 var nCount = dic.GetFiles().Count();25 var nMaxCount = 10;26 if (nCount > nMaxCount) //大于nMaxCount个文件清空临时目录27 {28 foreach (var item in dic.GetFiles().OrderBy(b => b.LastWriteTime).Take(nCount - nMaxCount))29 {30 try31 {32 item.Delete();33 }34 catch (Exception ex) { }35 }36 }37 38 var tempPath = Path.Combine(basePath, info.Name);39 var newInfo = info.CopyTo(tempPath, true);40 if (newInfo == null) { this.MsgBox($"文件:{path}查看失败,请稍后重试!"); return View(moFile); }41 42 moFile.Name = newInfo.Name;43 moFile.Url = $"/{moFile.Name}";44 moFile.Attributes = newInfo.Attributes;45 if (moFile.Attributes == FileAttributes.Archive && !ExtensionClass._FileExtension.Any(b => b == newInfo.Extension))46 {47 using (var stream = newInfo.OpenRead())48 {49 using (var reader = new StreamReader(stream))50 {51 moFile.COntent= await reader.ReadToEndAsync();52 }53 }54 }55 }56 catch (Exception ex)57 {58 this.MsgBox($"文件:{path}查看失败,请稍后重试!");59 }60 return View(moFile);61 }
怎么使用ShenNiu.LogTool工具呢
我这里只提供了一个windows x64平台的运行exe包ShenNiu.LogTool(不用安装什么运行环境),只需要双击“ShenNiu.LogTool.exe”-》配置Ip+端口(默认IP:127.0.0.1,端口:12345):
好了本章到此就结束了,怎么样干货还是可以吧,不妨点个"推荐",谢谢。再发下git地址:
以上就是分享一个磁盘文件查看系统的详细内容,更多请关注其它相关文章!
写下你的评论吧 !推荐阅读
本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]蜡笔小新 2023-12-14 18:28:01 本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]蜡笔小新 2023-12-14 14:01:06 本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]蜡笔小新 2023-12-13 21:23:45 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]蜡笔小新 2023-12-13 18:08:58 本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]蜡笔小新 2023-12-13 13:23:48 SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]蜡笔小新 2023-12-11 08:21:41 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]蜡笔小新 2023-12-10 10:55:21 这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]蜡笔小新 2023-10-17 19:33:18 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]蜡笔小新 2023-12-14 19:29:57 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]蜡笔小新 2023-12-14 16:19:10 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]蜡笔小新 2023-12-10 16:03:24 64G iPad升级到iPadOS后,发现外置存储只能在苹果自带的文件app中显示,非官方app无法直接读取外置存储的内容。用户只能先使用自带文件app将文件复制到iPad上,再用程序读取。这种限制给用户带来了不便,而且操作过程中还存在拷贝不显示进度、容易失败、不能安全弹出等问题。 ... [详细]蜡笔小新 2023-12-10 15:29:03 本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]蜡笔小新 2023-12-10 11:01:31 mobiledu2502857407这个家伙很懒,什么也没留下!Tags | 热门标签RankList | 热门文章
- 1存储器层次结构全景:数据存储的大金字塔长什么样?
- 2ps如何裁剪掉图片的不规则区域
- 3无我编程:你的工作不代表你
- 4今年就要开始接触数字图像处理,敢问下大侠们有什么经典的书籍推荐的?
- 5在EXCEL表格中如何自己设置快捷件?
- 6盛大游戏CEO李瑜辞职:要创业不要期权
- 7SIT,UAT是什么? (后端知识)
- 8能不能作一个中文编译器???
- 9电商设计师(美工)必备|模板素材网站!
- 10请问摄像头拍摄的不清晰图片能否搞清晰
- 11如何为列excel中的所有单元格添加常量?
- 12ps怎样选取自己想要的图片部分(二)
- 13Axure怎么创建母版和使用?
- 14草根站长在初期应该做的网站内容有哪些?
- 15WAVE PCM 声音文件格式
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有