写在前面

之前的上传文件的功能,只能上传到根目录,前两篇文章实现了新建文件夹的功能,则这里对上传文件的功能进行适配。

系列文章

[EF]vs15+ef6+mysql code first方式

[实战]MVC5+EF6+MySql企业网盘实战(1)

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

[实战]MVC5+EF6+MySql企业网盘实战(3)——验证码

[实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

[Bootstrap]modal弹出框

[实战]MVC5+EF6+MySql企业网盘实战(5)——登录界面,头像等比例压缩

[实战]MVC5+EF6+MySql企业网盘实战(5)——页面模板

[实战]MVC5+EF6+MySql企业网盘实战(5)——ajax方式注册

[实战]MVC5+EF6+MySql企业网盘实战(6)——ajax方式登录

[实战]MVC5+EF6+MySql企业网盘实战(7)——文件上传

[实战]MVC5+EF6+MySql企业网盘实战(8)——文件下载、删除

[实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名

[实战]MVC5+EF6+MySql企业网盘实战(10)——新建文件夹

[实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2

[实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件

代码片段

发现如果从数据表中的filePath中获取目录,比较繁琐,干脆在myfile表中添加一个表示目录的字段folderPath,这样获取某个目录下的文件相对更方便一点。同时考虑有文件名称这个字段了,就将filePath这个字段删除了。

所以调整后的代码如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Script.Serialization;usingWolfy.NetDisk.BLL;usingWolfy.NetDisk.IBLL;usingWolfy.NetDisk.Model;usingWolfy.NetDisk.Utilities;namespaceWolfy.NetDisk.Site.Controllers
{public classHomeController : Controller{private IUserInfoServiceRepository _userInfoServiceRepository = newUserInfoServiceRepository();private IMyFileServiceRepository _myFileServiceRepository = newMyFileServiceRepository();[HttpGet]publicActionResult FileList(){UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){return RedirectToAction("Login", "UserInfo");}string folderPath = Request.Params["path"];Expression<Func<MyFile, bool>> where = null;if (string.IsNullOrEmpty(folderPath)){where = x => x.User.Id == userInfo.Id && x.FolderPath == "/NetDisk/" + userInfo.UserName + "/";}else{//保证路径格式一直以/结束folderPath = folderPath.TrimEnd('/') + "/";where = x => x.User.Id == userInfo.Id && !x.IsDelete && x.FolderPath ==folderPath;}var fileList = _myFileServiceRepository.FindAll(where).OrderBy(x => x.IsFolder).OrderByDescending(x =>x.CreateDt);ViewBag.UserInfo=userInfo;ViewBag.ChildTitle= "我的网盘";returnView(fileList);}[HttpPost]public void UploadFile(stringfilePath){UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");}var files =Request.Files;if (files.Count > 0){var file = files[0];string fileName =file.FileName;Stream inputStream=file.InputStream;string fileSaveFolder = string.Empty;if (!string.IsNullOrEmpty(filePath)){filePath=Server.UrlDecode(filePath);fileSaveFolder= Server.MapPath("~/" +filePath);}else{fileSaveFolder= Request.MapPath("~/NetDisk/" +userInfo.UserName);}//如果目标不存在,则创建if (!Directory.Exists(fileSaveFolder)){Directory.CreateDirectory(fileSaveFolder);}byte[] buffer = new byte[inputStream.Length];//判断是否已经超出个人网盘大小var myFiles = _myFileServiceRepository.FindAll(x => x.User.Id ==userInfo.Id);int myDiskSize = 0;if (myFiles.Count() > 0){myDiskSize= myFiles.Sum(x =>x.FileSize);}//如果已经超出网盘大小,则给出提示if (myDiskSize + buffer.Length >userInfo.NetDiskSize){AlertMsg("对不起,您的网盘空间不足,请清理后再次上传,或联系管理员进行扩容。", "");return;}inputStream.Read(buffer,0, buffer.Length);string strFileMd5 =MD5Helper.GetMD5FromFile(buffer);string fileSavePath =Path.Combine(fileSaveFolder, filePath);fileSavePath=Path.Combine(fileSaveFolder, fileName);//如果文件已经存在if(System.IO.File.Exists(fileSavePath)){//对文件进行重命名fileName =ReNameHelper.FileReName(fileSavePath);fileSavePath=Path.Combine(fileSaveFolder, fileName);}file.SaveAs(fileSavePath);var currentUser = _userInfoServiceRepository.Find(x => x.Id ==userInfo.Id);MyFile myFile= newMyFile(){FileMd5=strFileMd5,ModifyDt=DateTime.Now,IsDelete= false,FileSize=buffer.Length,FolderPath=filePath,FileExt=Path.GetExtension(fileSavePath),CreateDt=DateTime.Now,FileName=fileName,FileIcon=GetFileIcon(Path.GetExtension(fileSavePath)),User=currentUser,IsFolder= 1};//保存数据库
_myFileServiceRepository.Add(myFile);_myFileServiceRepository.SaveChanges();string json = newJavaScriptSerializer().Serialize(myFile);AlertMsg("上传成功", json);}}private void AlertMsg(string msg, stringfileJson){Response.ContentType= "text/html";Response.Write("<script>parent.showMsg('" + msg + "','" + fileJson + "');</script>");Response.End();}private string GetFileIcon(stringfileExt){string fileIconPath = "/Content/Images/";switch(fileExt.ToLower()){case ".doc":case ".docx":fileIconPath+= "DocType.png";break;case ".xlx":case ".xlxs":fileIconPath+= "XlsType.png";break;case ".ppt":case ".pptx":fileIconPath+= "PptType.png";break;case ".pdf":fileIconPath+= "PdfType.png";break;case ".apk":fileIconPath+= "ApkType.png";break;case ".dwt":case ".dwg":case ".dws":case ".dxf":fileIconPath+= "CADType.png";break;case ".exe":fileIconPath+= "ExeType.png";break;case ".png":case ".gif":case ".jpg":fileIconPath+= "ImgType.png";break;case ".txt":fileIconPath+= "TxtType.png";break;case ".bt":fileIconPath+= "TorrentType.png";break;case ".rmvb":case ".avi":case ".flv":fileIconPath+= "VideoType.png";break;case ".zip":case ".7z":case ".rar":fileIconPath+= "MusicType.png";break;case ".mp3":fileIconPath+= "MusicType.png";break;default:fileIconPath+= "OtherType.png";break;}returnfileIconPath;}/// <summary>///文件下载/// </summary>/// <param name="fileId"></param>public void DownLoadFile(stringfileId){UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");return;}if (string.IsNullOrEmpty(fileId)){throw new ArgumentNullException("fileId is errror");}int id =Convert.ToInt32(fileId);var findFile = _myFileServiceRepository.Find(x => x.Id ==id);if (findFile == null){AlertMsg("文件不存在", "");return;}string filePath = Request.MapPath("~/" + findFile.FolderPath + "/" +findFile.FileName);//以字符流的形式下载文件FileStream fs = newFileStream(filePath, FileMode.Open);byte[] bytes = new byte[(int)fs.Length];fs.Read(bytes,0, bytes.Length);fs.Close();Response.ContentType= "application/octet-stream";//通知浏览器下载文件而不是打开Response.AddHeader("Content-Disposition", "attachment; filename=" +HttpUtility.UrlEncode(findFile.FileName, System.Text.Encoding.UTF8));Response.BinaryWrite(bytes);Response.Flush();Response.End();}public void DeleteFile(stringfileId){UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");return;}if (string.IsNullOrEmpty(fileId)){throw new ArgumentNullException("fileId is errror");}int id =Convert.ToInt32(fileId);var findFile = _myFileServiceRepository.Find(x => x.Id ==id);if (findFile == null){AlertMsg("文件不存在", "");return;}findFile.IsDelete= true;_myFileServiceRepository.Update(findFile);int count =_myFileServiceRepository.SaveChanges();if (count > 0){var response = new { code = 4, fileId =findFile.Id };Response.Write(newJavaScriptSerializer().Serialize(response));}}publicJsonResult EditFileName(){string fileId = Request.Form["fileId"];string fileNewName = Request.Form["fileNewName"];UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");}int id =Convert.ToInt32(fileId);var findFile = _myFileServiceRepository.Find(x => x.Id ==id);findFile.FileName=fileNewName;_myFileServiceRepository.Update(findFile);int count =_myFileServiceRepository.SaveChanges();if (count > 0){var response = new{code= 200,msg= "更新成功"};return new JsonResult() { Data = newJavaScriptSerializer().Serialize(response) };}return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 500, msg = "保存失败"}) };}publicJsonResult CreateFolder(){UserInfo userInfo= Session["user"] asUserInfo;if (userInfo == null){RedirectToAction("Login", "UserInfo");}string folderPath = Server.UrlDecode(Request.Params["folderPath"]);string folderName = Request.Params["folderName"];if (string.IsNullOrEmpty(folderName)){throw new ArgumentNullException("文件夹名称不能为空");}//检查文件夹是否已经存在Expression<Func<MyFile, bool>> where = null;if (string.IsNullOrEmpty(folderPath)){where = x => x.User.Id == userInfo.Id && x.IsFolder == 0 && x.IsDelete == false && x.FolderPath == "/NetDisk/Wolfy/";}else{where = x => x.User.Id == userInfo.Id && x.IsFolder == 0 && x.IsDelete == false && x.FolderPath ==folderPath;}var count = _myFileServiceRepository.FindAll(where).Count();userInfo= _userInfoServiceRepository.Find(x => x.Id ==userInfo.Id);if (count > 0){//如果不存在,则新建,否则进行自动重命名folderName = folderName + "(" + (count + 1).ToString() + ")";}if (string.IsNullOrEmpty(folderPath)){folderPath= "/NetDisk/" +userInfo.UserName;}MyFile folder= newMyFile(){FolderPath= folderPath.TrimEnd('/') + "/",FileName=folderName,CreateDt=DateTime.Now,User=userInfo,FileExt= string.Empty,FileIcon= "/Content/Images/FolderType.png",FileMd5= string.Empty,FileSize= 0,IsDelete= false,ModifyDt=DateTime.Now};try{_myFileServiceRepository.Add(folder);_myFileServiceRepository.SaveChanges();}catch(Exception){return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 500, msg = "创建失败"}) };}return new JsonResult() { Data = new JavaScriptSerializer().Serialize(new { code = 200, folder =folder }) };}}
}

HomeController

前端代码如下

@model IEnumerable<Wolfy.NetDisk.Model.MyFile>@{ViewBag.Title = "FileList";Layout = "~/Views/Shared/_Layout.cshtml";}<buttonid="btnUpload"class="btn-primary">上传文件</button>
<buttonclass="btn-primary"id="btnNewFolder">新建文件夹</button><divclass="box-content"id="fileList"><divclass="dataTables_wrapper"role="grid"><tableid="fileList"class="table table-striped table-bordered responsive"aria-describedby="DataTables_Table_0_info"><thead><trrole="row"><thclass="sorting_asc"role="columnheader"tabindex="0"aria-controls="DataTables_Table_0"rowspan="1"colspan="1"aria-sort="ascending"aria-label="Username: activate to sort column descending"style="width: 312px;">文件名</th><thclass="sorting"role="columnheader"tabindex="0"aria-controls="DataTables_Table_0"rowspan="1"colspan="1"aria-label="Role: activate to sort column ascending"style="width: 144px;">大小</th><thclass="sorting"role="columnheader"tabindex="0"aria-controls="DataTables_Table_0"rowspan="1"colspan="1"aria-label="Date registered: activate to sort column ascending"style="width: 263px;">修改日期</th><thclass="sorting"role="columnheader"tabindex="0"aria-controls="DataTables_Table_0"rowspan="1"colspan="1"aria-label="Actions: activate to sort column ascending"style="width: 549px;">操作</th></tr></thead><tbodyrole="alert"aria-live="polite"aria-relevant="all">@{int i = 0;}@foreach (var item in Model){i++;<trclass="i%2==0?'even':'odd'"id="tr-@item.Id">@{if (@item.FileMd5 != ""){<tdclass=" even sorting_1"><imgsrc="@item.FileIcon"alt="" /> <spanid="sp-@item.Id">@item.FileName</span></td><tdclass="center ">@item.FileSize  字节</td>}else{<tdclass=" even sorting_1"><ahref="FileList?path=@item.FolderPath@item.FileName"id="lnkFolder-@item.Id"onclick="clickFolder('sp-@item.Id')"><imgsrc="@item.FileIcon"alt="@item.FileName" /><spanid="sp-@item.Id">@item.FileName</span></a></td><tdclass="center "></td>}}<tdclass="center ">@item.ModifyDt</td><tdclass="center "><aclass="btn btn-info"href="javascript:void(0)"onclick="editFile(@item.Id,'@item.FileName')"><iclass="glyphicon glyphicon-edit icon-white"></i>编辑</a><aclass="btn btn-danger"href="javascript:void(0)"onclick="deleteFile(@item.Id)"><iclass="glyphicon glyphicon-trash icon-white"></i>删除</a>@{ if (@item.FileMd5 != ""){<aclass="btn btn-success"href="/Home/DownLoadFile?fileId=@item.Id"><iclass="glyphicon glyphicon-zoom-in icon-white"></i>下载</a>}}</td></tr>}</tbody></table></div>
</div>
<divclass="modal fade"id="modal-edit"tabindex="-1"role="dialog"aria-labelledby="myModalLabel"aria-hidden="true"><divclass="modal-dialog"><divclass="modal-content"><divclass="modal-header"><buttontype="button"class="close"data-dismiss="modal">×</button><h3id="alertTitlte">编辑</h3></div><divclass="modal-body"></div><divclass="modal-footer"><ahref="#"class="btn btn-default"data-dismiss="modal"id="lnkCancel">取消</a><ahref="#"class="btn btn-primary"data-dismiss="modal"id="lnkSave">保存</a></div></div></div>
</div><formaction="UploadFile"id="fileForm"method="post"enctype="multipart/form-data"target="fileFrame"><inputtype="file"accept="*/*"style="display:none"id="btnFile"name="fileData" /><inputtype="hidden"id="hdFilePath"name="filePath"value="" /><inputtype="hidden"id="hdcallbackInfo"name="name"value="" />
</form><iframestyle="display:none"name="fileFrame"id="fileFrame"></iframe>
<script>functionCurentTime() {varnow= newDate();varyear=now.getFullYear();//varmonth=now.getMonth()+ 1;//varday=now.getDate();//varhh=now.getHours();//varmm=now.getMinutes();//varclock=year+ "-";if(month< 10)clock+= "0";clock+=month+ "-";if(day< 10)clock+= "0";clock+=day+ " ";if(hh< 10)clock+= "0";clock+=hh+ ":";if(mm< 10) clock+= '0';clock+=mm;return(clock);};//上传成功后,单击确定,更新刚刚拼接文件信息functionshowMsg(msg, callbackInfo) {if(msg) {$(".modal-body").html(msg);//回调信息
$("#hdcallbackInfo").val(callbackInfo);console.log(callbackInfo);//为确定按钮注册单击事件,确定后更新拼接在列表上的文件信息
$('#fileListSure').bind('click',function() {varfileInfo=$("#hdcallbackInfo").val();console.log(fileInfo);fileInfo=JSON.parse(fileInfo);$("#fileDownLoad").attr("href","/Home/DownLoadFile?fileId=" +fileInfo.Id);$("#fileName").html('<img src="' +fileInfo.FileIcon+ '" id="fileicon" alt="" />' +fileInfo.FileName+ '');});$("#myModal").modal("show");};};//创建文件夹
$('#btnNewFolder').click(function() {//设置弹出框标题vartitle=$('#alertTitlte').html();//从url中获取当前目录varurl=window.location.href;console.log(url);if(url.indexOf('path')> 1) {$('#hdFilePath').val(url.split('=')[1]);};$('#alertTitlte').html('新建文件夹');//清空弹出框内容
$(".modal-body").html('');$(".modal-body").html('<input type="text" placeholder="请输入名称" class="form-control" name="name" value="新建文件夹" id="txtFileName" />');$('#txtFileName').val('');$('#modal-edit').modal('show');$('#txtFileName').val('新建文件夹');$('#lnkSave').unbind('click');$('#lnkSave').bind('click',function() {$.post('CreateFolder', { folderName: $('#txtFileName').val(), folderPath: $('#hdFilePath').val() },function(data) {data=JSON.parse(data);varfolder=data.folder;if(data.code== 200) {$('<tr class="odd">   <td class=" even sorting_1" id="fileName"> <a href="#" id="lnkFolder-' +folder.Id+ '" οnclick="clickFolder(sp-' +folder.Id+ ')"><img src="/Content/Images/FolderType.png" id="fileicon" alt="" />' +folder.FileName+ '</a></td><td class="center"></td><td class="center ">' +CurentTime()+ '</td><td class="center "><a class="btn btn-info" href="#"  id="fileEdit"> <i class="glyphicon glyphicon-edit icon-white"></i> 编辑 &nbsp;</a><a class="btn btn-danger" href="#"><i class="glyphicon glyphicon-trash icon-white" id="fileDelete"></i> 删除 </a> </td></tr>').insertBefore($('#fileList tbody'));};//还原弹出框标题
$('#alertTitlte').html(title);});});});//编辑文件名functioneditFile(fileId, fileName) {$(".modal-body").html('');$(".modal-body").html('<input type="text" placeholder="请输入名称" class="form-control" name="name" value="' +fileName+ '" id="txtFileName" />');$("#modal-edit").modal('show');//弹出框注册取消,保存事件
$('#lnkCancel').click(function() {//单机取消,清空内容
$("#txtFileName").val('');});//首先移除已经绑定的单机事件
$('#lnkSave').unbind('click');$('#lnkSave').bind('click',function() {varfile={fileId: fileId,fileNewName: $('#txtFileName').val()};$.post("/Home/EditFileName", file,function(data) {data=JSON.parse(data);if(data.code== 200) {$('#sp-' +fileId).html(file.fileNewName);}});});};functiondeleteFile(fileId) {console.log(fileId);$.getJSON("/Home/DeleteFile?fileId=" +fileId,function(data) {console.log(data.code);if(data.code== 4) {$("#tr-" +fileId).remove();};});};$('#btnUpload').click(function() {//从url中获取当前目录varurl=window.location.href;console.log(url);if(url.indexOf('path')> 1) {$('#hdFilePath').val(url.split('=')[1]);};$("#btnFile").click();});$("#btnFile").change(function() {varfiles= this.files;for(vari= 0; i<files.length; i++) {varfile=files[i];console.log(file);$('<tr class="odd">   <td class=" even sorting_1" id="fileName"><img src="/Content/Images/othertype.png" id="fileicon" alt="" />' +file.name+ '</td><td class="center">' +file.size+ '字节</td><td class="center ">' +CurentTime()+ '</td><td class="center "><a class="btn btn-info" href="#" id="fileEdit" > <i class="glyphicon glyphicon-edit icon-white"></i> 编辑 </a><a class="btn btn-danger" href="#"><i class="glyphicon glyphicon-trash icon-white" id="fileDelete"></i> 删除 </a>  <a class="btn btn-success" href="#" id="fileDownLoad"><i class="glyphicon glyphicon-zoom-in icon-white"></i> 下载  </a></td></tr>').appendTo($('#fileList tbody'));};$('#fileForm').submit();});</script>

FileList.cshtml

测试

总结

将新建文件夹与上传文件功能组合。

[实战]MVC5+EF6+MySql企业网盘实战(12)——新建文件夹和上传文件相关推荐

  1. [实战]MVC5+EF6+MySql企业网盘实战(16)——逻辑重构3

    写在前面 本篇文章将新建文件夹的逻辑也进行一下修改. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5 ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(15)——逻辑重构2

    写在前面 上篇文章修改文件上传的逻辑,这篇修改下文件下载的逻辑. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实 ...

  3. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表

    写在前面 上篇文章实现了文档列表,所以实现视频列表就依葫芦画瓢就行了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) ...

  4. mvc5 ef6 mysql_[实战]MVC5+EF6+MySql企业网盘实战(17)——思考2

    写在前面 今天吃饭回来,突然有一个更好的想法,这里做一下记录. 系列文章 [实战]MVC5+EF6+MySql企业网盘实战(17)--思考2 思路 平时如果要获取电脑上的文件,大都会采用递归的方式,所 ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

    写在前面 上篇文章简单介绍了项目的结构,这篇文章将实现用户的注册.当然关于漂亮的ui,这在追后再去添加了,先将功能实现.也许代码中有不合适的地方,也只有在之后慢慢去优化了. 系列文章 [EF]vs15 ...

  6. 上传头像mysql_上传头像 - MVC5+EF6+MySql企业网盘实战 - 爱整理

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 示例 这里采用最简单 ...

  7. [VS_C#实战案例](1)批量提取文件夹内txt文件的指定字符串生成excel表格

    [VS_C#实战案例](1)批量提取文件夹内txt内容生成excel表格 个人边学习边开发的日常总结,发布在此与各位交流.共同进步. 语言:c# 软件:visual studio 实现功能:提取指定文 ...

  8. Windows如何自定义U盘盘符、文件夹图标、文件夹背景

    自定义U盘盘符.文件夹图标.文件夹背景 注意对于Vista和Win7的用户不支持文件夹图标和文件夹背景的更换 1.自定义盘符: 在U盘根目录下新建文件 autorun.inf(可先建.txt文本文档, ...

  9. 详解C盘Windows文件夹里重要文件的作用

    详解C盘Windows文件夹里重要文件的作用 在整个Windows操作系统中,最重要的莫过于"Windows"文件夹,对电脑进行任何操作几乎都有关.了解这里对于掌握整个系统的运作有 ...

最新文章

  1. [汇编语言]-第十章 ret,retf,call指令
  2. Java 使用 Timer 进行调度
  3. 中文名称:案例编程MOOK系列
  4. Oracle中to_char()函数的用法
  5. java.lang.ClassNotFoundException: org.apache.commons.codec.DecoderException
  6. Android 之 下拉框(Spinner)的使用
  7. linux系统scsi硬盘,Linux系统SCSI磁盘管理全攻略(二)
  8. 加密解密之 crypto-js 知识
  9. 华为 IPD 集成产品开发流程的缺点和适用局限性
  10. nmos导通流向_MOS管类型-MOS管4种类型与工作原理解析
  11. Android设置输入法
  12. 2022/1/12(自闭半日游)
  13. 线性代数:03 向量空间 -- 线性相关与线性无关
  14. 杜克大学计算机世界排名,国本美本多背景的他竟拿杜克大学保底!轻松收获21年CS录取!...
  15. 哈工大李治军老师操作系统笔记【29】:目录与文件系统(Learning OS Concepts By Coding Them !)
  16. iceberg系列:源码- BinPacking 解读
  17. 基于加取模和循环左移运算的扩散算法matlab
  18. 登录服务器显示需要输入密码,远程服务器每次都需要输入账号密码
  19. C++ map和unordered_map详解
  20. 代码注释生成:《Towards Automatically Generating Summary Comments for Java Methods》论文笔记

热门文章

  1. python中函数的名称可以随意命名吗_函数的名称可以随意命名。(3.0分)_学小易找答案...
  2. matlab表格三维柱状图,excel制作四维数据表格-excel三维柱形图 ,请问如何根据excel表格中的数据......
  3. 登录mysql 1130_解决远程登录mysql数据库报1130错误-阿里云开发者社区
  4. Android 屏幕防偷窥,Android 8.1将发布:启用TLS加密防偷窥
  5. python 输入中文_【提醒】Python新手开发人员注意事项:不要误输入中文标点符号...
  6. php 类遍历,php数组遍历类与用法示例
  7. 用typescript完成倒计时_「2019 JSConf.Hawaii - Brie.Bunge」大规模应用 TypeScript
  8. taro 小程序转h5之后报错_原生小程序转H5
  9. python进入上下文管理器_浅谈Python中with(上下文管理器)的用法
  10. VSS 2005配置,很详细