C#结合JavaScript实现多文件上传

目录

需求

引入

关键代码

操作界面

JavaScript包程序

服务端 ashx 程序

服务端上传后处理程序

小结


需求

在许多应用场景里,多文件上传是一项比较实用的功能。实际应用中,多文件上传可以考虑如下需求:

1、对上传文件的类型、大小有一个基本的控制。

2、上传文件时有一个进度显示,包括当前文件和整体进度。

3、上传后,在服务端后续事件进行一些处理。

引入

首先请在WEB应用程序根目录下创建COMMON目录,并引入 JavaScript 程序包,该程序包已经打包,下载地址为:https://download.csdn.net/download/michaelline/88615565

下载成功后解压到COMMON目录即可,请引入如下图中的 JS 文件:

另外,我们还需要在 app_data目录下创建 ajaxUploadFiles 子目录,以备上传创建文件使用。

关键代码

操作界面

界面上放置标准的 input file 控件,并将其服务器化,即 runat="server"。点击选择文件,选中所有目标文件后,自动实现文件上传功能。

示例界面如下:

示例UI代码如下:

<input  class="file" type="file" id="ajaxMfile" runat="server" 
                                    onbeginupload="ajax_uploadFiles_beginUpload" onprogressupload="ajax_uploadFiles_progressUpload" onendupload="ajax_uploadFiles_endUpload" 
                                    multiple="multiple" allowtype="pptx|docx|mp3|txt|std" allowsize="500m|100m" fileindex="0" name="fileupload"
                                    serverbuttonid="ajaxEndBtn" serverfilelistid="ajaxReturnFileName"
                                    progresspanelid="ajaxMfileProgressPanel"
                                    onchange="ajax_uploadFiles(this);return false" />
                            <asp:TextBox runat="server" Width="100%" ID="ajaxReturnFileName" style="display:none" ></asp:TextBox>
                                        <br />
                            <asp:button ID="ajaxEndBtn" text="后台处理" runat="server" style="display:none" onclick="ajaxEndBtn_Click"  />
                                        <br />
                                        <br />
                                        <table style="display:none; color:White" id="ajaxMfileProgressPanel">
                                            <tr>
                                                <td >
                                                    当前文件:</td>
                                                <td style="position:relative; padding:0px">
                                                    <asp:Label Font-Size="9pt" style="z-index:1;position:absolute;left:0px;top:-9px;" Width="300px" runat="server" ID="ajax_uploadFiles_curfilename"/>
                                                </td>
                                            </tr>
                                            <tr>
                                                <td style="position:relative; padding:0px;width:120px">
                                                    当前文件进度<asp:Label style="z-index:1;position:absolute;left:85px;top:-9px;" runat="server" Font-Size="9pt" ID="ajax_uploadFiles_upprogress"></asp:Label>
                                                </td>
                                                <td style="position:relative; padding:10px">
                                                    <img id="ajax_uploadFiles_curprogress" style="z-index:1;position:absolute;left:0px;top:4px;width:0px;height:12px" alt="" src="/common/Jquery/images/win7progress.jpg" />
                                                    <div id="ajax_uploadFiles_curbg" style="z-index:0;position:absolute;left:0px;top:4px;width:300px;height:12px;background-color:Gray"></div>
                                                </td>

                                            </tr>
                                            <tr>
                                                <td style="position:relative; padding:0px">
                                                    上传总量进度<asp:Label style="z-index:1;position:absolute;left:85px;top:-9px;" runat="server" Font-Size="9pt" ID="ajax_uploadFiles_cprogress"></asp:Label></td>
                                                <td style="position:relative; padding:10px">
                                                    <img id="ajax_uploadFiles_totalprogress" style="z-index:1;position:absolute;left:0px;top:4px;width:0px;height:12px" alt="" src="/common/Jquery/images/win7progress2.jpg" />
                                                    <div id="ajax_uploadFiles_totalbg" style="z-index:0; position:absolute;left:0px;top:4px;width:300px;height:12px;background-color:Gray"></div>
                                                </td>
                                            </tr>
                                            
                                        </table>
                                        <table style="color:White; width:100%">
                                           <tr>
                                                <td style="position:relative">
                                                    <asp:Label runat="server" Font-Size="11pt" ID="ajax_uploadFiles_serverProcessTip"></asp:Label>
                                                </td>
                                            </tr>
                                        </table>

input file 控件的一些设置如下:

(1)onbeginupload="ajax_uploadFiles_beginUpload"   js方法,开始上传前事件,默认值

(2)onprogressupload="ajax_uploadFiles_progressUpload"   js方法,上传中事件,默认值

(3)onendupload="ajax_uploadFiles_endUpload"    js方法,选择完文件上传事件,默认值
(4)multiple="multiple"         控件属性,允许多文件选中上传

(5)allowtype="pptx|docx|mp3|txt|std"    自定义属性,允许上传的文件类型,以 | 分隔

(6)allowsize="500m|100m"    自定义属性,允许上传的文件最大尺寸,可以以 | 分隔,并一一对应,如果不对应,则根据 allowtype 的设置从左至右进行匹配

        如举例中的设置则表示为,pptx 允许最大 500M, docx 最大 100M,后面未设置则均为100M

(7) serverbuttonid="ajaxEndBtn"   自定义属性,执行的服务器按钮ID,默认值 

(8)serverfilelistid="ajaxReturnFileName"  自定义属性,服务器端返回的文件ID列表,默认值

(9)οnchange="ajax_uploadFiles(this);return false"  自定义属性,js方法,选择文件后自动执行上传功能,默认值

根据示例代码的设置,以上部分除了 allowtype和 allowsize 均可以不用改变设置。

上传中的效果如下图:

 

JavaScript包程序

本包程序实现了前面设置的界面元素方法、事件、属性的实现及对文件上传的客户端控制,示例代码如下:

 //批量上传文件的内置默认辅助方法,表示每上传一个文件之前发生的事件,
         //事件的fileObj参数代表 file对象(上传控件),由主方法自动传入,开发者可以重新指定自定义方法
         function ajax_uploadFiles_beginUpload(fileObj) {
            var fIndex = parseInt(fileObj.getAttribute("fileindex"),10);
            if (fIndex == 0) {
                document.getElementById('ajax_uploadFiles_serverProcessTip').innerHTML = '';
                document.getElementById("ajax_uploadFiles_upprogress").innerHTML = "";
                document.getElementById("ajax_uploadFiles_cprogress").innerHTML = "";
                document.getElementById("ajax_uploadFiles_totalprogress").style.width = "0px";
                document.getElementById(fileObj.getAttribute("serverfilelistid")).value = "";
            }
            document.getElementById("ajax_uploadFiles_curfilename").innerHTML = fileObj.files[fIndex].name;
        }
        //批量上传文件的内置默认辅助方法,表示当前正在上传文件时发生的事件(主要用于显示上传进度),
        //事件的fileObj参数代表 file对象(上传控件), loaded:已经上传的文件总字节,total:正在上传的文件总字数,        // percent:不超过100的整数,表示为百分比。这些参数由主方法自动传入,开发者可以重新指定自定义方法
        function ajax_uploadFiles_progressUpload(fileObj,loaded,total,percent) {
            document.getElementById("ajax_uploadFiles_upprogress").innerHTML = ("" + percent + "%");
            var curb = parseInt(document.getElementById("ajax_uploadFiles_curbg").style.width,10);
            document.getElementById("ajax_uploadFiles_curprogress").style.width = Math.floor(curb * loaded / total) + "px";
        }
        //批量上传文件的内置默认辅助方法,表示当前文件上传完成时发生的事件(主要用于处理文件上传后的跟踪处理,并且返回服务器上保存的文件列到一个文本框中,以|分隔),
        //事件的fileObj参数代表 file对象(上传控件), type:上传状态返回,包括success成功,error失败, 
        //data:文件的数据,暂时未使用,desfile:要保存在服务器上的文件名
        // 这些参数由主方法自动传入,开发者可以重新指定自定义方法
        function ajax_uploadFiles_endUpload(fileObj,type,data,desfile) {
            var fIndex = parseInt(fileObj.getAttribute("fileindex"),10);
            var filecount = fileObj.files.length;
            document.getElementById(fileObj.getAttribute("serverfilelistid")).value += desfile + "|";
            var totalb = parseInt(document.getElementById("ajax_uploadFiles_totalbg").style.width,10);
            document.getElementById("ajax_uploadFiles_totalprogress").style.width = Math.floor(totalb * (fIndex + 1) / filecount) + "px";
            document.getElementById("ajax_uploadFiles_cprogress").innerHTML = ("" + Math.floor(100 * (fIndex + 1) / filecount) + "%");
            if (fIndex < filecount - 1) {
                fIndex++;
                fileObj.setAttribute("fileindex",fIndex);
                ajax_uploadFiles(fileObj);
                return;
            }
            fileObj.setAttribute("fileindex",0);

            if (type == "success") {
                            document.getElementById('ajaxMfile').style.display='none';
                document.getElementById('ajax_uploadFiles_serverProcessTip').innerHTML = '上传完成!正在进行后台处理...';
                document.getElementById(fileObj.getAttribute("serverbuttonid")).click();
            } else if (type == "error") {
                alert("error");
            }
        }
        //生成一个guid
        function newguid() {
            function S4() {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            }
            return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
        }
        //批量上传文件的主方法,fileObj参数代表 file对象(上传控件)
        function ajax_uploadFiles(fileObj) {
            var formData = new FormData();
            var fIndex = parseInt(fileObj.getAttribute("fileindex"),10);
            var filecount = fileObj.files.length;
            if (filecount == 0) {
                alert('请先浏览选择文件...');
                return;
            }
            var uploadSessionId = newguid();
            var upfile = fileObj.files[fIndex].name;
            var dotpos = upfile.lastIndexOf('.');
            var desfile = "";
            var exname = "";
            if (dotpos > 0) {
                exname = upfile.substring(dotpos + 1,upfile.length);
                desfile = uploadSessionId + upfile.substring(0,dotpos) + '.' + exname;
            } else {
                desfile = uploadSessionId + upfile;
            }
            //        alert(Math.round(upsize / 1024));
            if (fIndex == 0) {
                var allowtype = fileObj.getAttribute("allowtype");
                var allowsize = fileObj.getAttribute("allowsize");
                var at = allowtype.split('|');
                var as = allowsize.split('|');
                for (var j = 0; j < filecount; j++) {
                    var validfile = fileObj.files[j].name;
                    var upsize = fileObj.files[j].size;
                    var validdotpos = validfile.lastIndexOf('.');
                    var validexname = "";
                    if (validdotpos > 0) {
                        validexname = validfile.substring(validdotpos + 1,validfile.length);
                    }
                    var i = 0;
                    if (allowtype != "") {
                        var find = false;
                        for (i = 0; i < at.length; i++) {
                            if (at[i].toLowerCase() == validexname.toLowerCase()) {
                                find = true;
                                break;
                            }
                        }
                        if (find == false) {
                            alert("文件" + validfile + "上传的类型不符合要求!仅允许上传扩展名为:" + allowtype.split("|").join("、") + "的文件。");
                            fileObj.style.display = '';
                            document.getElementById(fileObj.getAttribute("progresspanelid")).style.display = 'none';
                            var t = fileObj;
                            t.outerHTML = t.outerHTML;
                            return;
                        }
                    }
                    if (allowsize != "") {
                        if (at.length <= as.length) {
                        } else {
                            i = 0;
                        }
                        as[i] = as[i].toLowerCase();
                        var csize = parseInt(as[i]);
                        var tsize = upsize;
                        if (as[i].lastIndexOf('k') != -1) {
                            csize = csize * 1024;
                            tsize = Math.round(upsize / 1024) + "KB";
                        } else if (as[i].lastIndexOf('m') != -1) {
                            csize = csize * 1024 * 1024;
                            tsize = Math.round(upsize / 1024 / 1024) + "MB";
                        } else if (as[i].lastIndexOf('g') != -1) {
                            csize = csize * 1024 * 1024 * 1024;
                            tsize = Math.round(upsize / 1024 / 1024 / 1024) + "GB";
                        } else if (as[i].lastIndexOf('t') != -1) {
                            csize = csize * 1024 * 1024 * 1024 * 1024;
                            tsize = Math.round(upsize / 1024 / 1024 / 1024 / 1024) + "TB";
                        }
                        if (upsize > csize) {
                            alert("上传文件" + validfile + "的大小近" + tsize + ",系统规定大小不能超过" + as[i].toUpperCase() + ",请重新选择。");
                            fileObj.style.display = '';
                            document.getElementById(fileObj.getAttribute("progresspanelid")).style.display = 'none';
                            var t = fileObj;
                            t.outerHTML = t.outerHTML;
                            return;

                        }
                    }
                } //j
            } // findex
            //        document.getElementById(callObjId).disabled = 'disabled';

            //        if (beginFuncName != null) {
            //            beginFuncName(fIndex,filecount,upfile);
            //        }
            fileObj.style.display = 'none';
            document.getElementById(fileObj.getAttribute("progresspanelid")).style.display = '';
            var findfunc = fileObj.getAttribute("onbeginupload");
            if (eval(findfunc)) {
                var execfunc = eval(findfunc);
                //            alert(findfunc);
                execfunc(fileObj);
            }

            formData.append("file",fileObj.files[fIndex]); //append()里面的第一个参数file对应permission/upload里面的参数file
            var processUploadUrl = window.location.protocol + "//" + window.location.host + "//common//uploadfile.ashx?guid=" + uploadSessionId;
            $.ajax({
                type: "post",                async: true, //这里要设置异步上传,才能成功调用myXhr.upload.addEventListener('progress',function(e){}),progress的回掉函数
                Accept: 'text/html;charset=UTF-8',                data: formData,                contentType: "multipart/form-data",                url: processUploadUrl,                processData: false,// 告诉jQuery不要去处理发送的数据
                contentType: false,// 告诉jQuery不要去设置Content-Type请求头
                xhr: function () {
                    myXhr = $.ajaxSettings.xhr();
                    if (myXhr.upload) { // check if upload property exists
                        myXhr.upload.addEventListener('progress',function (e) {
                            var loaded = e.loaded;                  //已经上传大小情况 
                            var total = e.total;                      //附件总大小 
                            var percent = Math.floor(100 * loaded / total);     //已经上传的百分比  
                            //                        if (progressFuncName != null) {
                            //                            progressFuncName(loaded,percent);
                            //                        }
                            var findfunc = fileObj.getAttribute("onprogressupload");
                            if (eval(findfunc)) {
                                var execfunc = eval(findfunc);
                                //            alert(findfunc);
                                execfunc(fileObj,percent);
                            }
                            //                            $("#processBar").css("width",percent);
                        },false); // for handling the progress of the upload
                    }
                    return myXhr;
                },                success: function (data) {
                    if (fIndex == fileObj.files.length - 1) {
                        fileObj.style.display = '';
                        document.getElementById(fileObj.getAttribute("progresspanelid")).style.display = 'none';
                        var t = fileObj;
                        t.outerHTML = t.outerHTML;
                    }
                    //                if (endFuncName != null) {
                    //                    endFuncName("success",desfile,fIndex,filecount);
                    //                }
                    var findfunc = fileObj.getAttribute("onendupload");
                    if (eval(findfunc)) {
                        var execfunc = eval(findfunc);
                        //            alert(findfunc);
                        execfunc(fileObj,"success",desfile);
                    }
                },                error: function (XMLHttpRequest,textStatus,errorThrown) {
                    alert(errorThrown);
                    if (endFuncName != null) {
                        endFuncName(fileObj,"error",null,'');
                    }
                }
            });
        } 

服务端 ashx 程序

ashx,一般处理程序(HttpHandler)是·NET众多web组件的一种。一个 httpHandler 接受并处理一个http请求,类似 Java 中的 servlet 。

本程序实现服务器端上传文件的接收和另存操作,在这里我们存为uploadfile.ashx,代码如下:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.IO;

public class Handler : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        if (context.Request.Files.Count > 0)
        {
            //HttpContext.Current.Request.FilePath;
            string strPath = System.Web.HttpContext.Current.Server.MapPath("~/app_data/ajaxUploadFiles/");
            string strName = context.Request.Files[0].FileName;
            string ext=Path.GetExtension(strName);
            string filename =HttpContext.Current.Request.QueryString["guid"].ToString()+Path.GetFileNameWithoutExtension(strName);
            if(ext!=""){
                filename = filename  + ext;
            }
            context.Request.Files[0].SaveAs(System.IO.Path.Combine(strPath,filename));
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

服务端上传后处理程序

在多个文件上传到服务器后,我们需要对文件进行后期处理,在前端我们设置了ID为 “ajaxEndBtn”的服务器按钮,进行模拟调用其 click 事件。

服务器端按钮处理事件示例代码如下:

   void ajaxEndBtn_Click(object sender,EventArgs e)
    {
        //得到保存后的文件名列表
        string[] upfiles = ajaxReturnFileName.Text.Split('|');
        //给予用户基本的提示
        ajax_uploadFiles_serverProcessTip.Text = "本次上传分析:共计上传" + (upfiles.Length - 1).ToString() + "个文件。";
        //遍历上传文件列表,进行后期处理
        foreach (string filename in upfiles)
        {
            if (filename.Trim() == "") continue;
            string upfilename = Request.PhysicalApplicationPath + "app_data\\ajaxUploadFiles\\" + filename;
            string exname = System.IO.Path.GetExtension(upfilename);

            //执行业务处理程序


        }

 

小结

以上提供的代码仅供参考,默认的设置仅可能提供最基础的实现,比如 ashx 程序还需要进行安全控制;进度图片和UI可以重新设计;实际的业务可以根据需求对控件的属性、事件进行重写。

以上就是自己的一些分享,时间仓促,不妥之处还请大家批评指正!

原文地址:https://blog.csdn.net/michaelline/article/details/134912537

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作中,很多时候我们经常会使用到虚拟机来进行环境的测试,我们平时在虚拟机上接触的最多的莫过于Linux和Winwdos。不过虚拟机环境和物理机环境是无法直接传输的,那么有的时候呢,同学们又想要在两者之间相互传输文件,可能就会使用QQ邮箱等形式来传输,这样的效率又慢而且繁琐,今天我就为大家带来一种非常便捷的传输方式。通过XFTP工具来进行文件传输。_xftp连接windows
文章浏览阅读1k次。解决 Windows make command not found 和 安装 GCC 环境_windows下载gcc
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计算机配置“ - ”管理模板“ - ”网络“ - ”Lanman工作站”,点击右侧的“启用不安全的来宾登录”策略。Windows访问samba共享时,提示“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问”1、键盘按下window+R键,输入gpedit.msc,启动本地组策略编辑器。首先在终端中输入sudo ufw status查看当前防火墙状态。默认状态是“未配置”,修改为“已启用”。示例:创建一个narada的目录在/home下。1.更新apt储存库列表。_ubuntu samba 目标文件夹访问被拒绝
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是Blu-ray Disc,一种高清的电影版本,这种电影十分清晰但是数据量巨大,占数十G甚至上百G的容量,只有蓝光光碟才能装得下,所以这种高清电影被称为BD版。一般的高清电影多半是从蓝光电影、国外的高清电视频道上压制而来的,可以通过网络下载,多数都经过二次压缩,画质要逊于原视频,不过压缩后的容量从蓝光的25G-50G会减少成4G-8G等(15G-20G不等)。众所周知,视频有两种常见的清晰度,BD和HD,在看电影的时候最常出现这两个标志,那么BD和HD具体指的是什么呢?_bd hd
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,因为它允许直接访问当前元素,而不需要类型转换。接口,它可以提供一个迭代器,用于按顺序访问集合中的元素。接口是只读的,它只能支持前向迭代,不能修改集合中的元素。类型的集合实例,并向其中添加了几个元素。接口,可以创建一个能够迭代访问泛型集合中元素的迭代器。接口,我们可以在 C# 中实现可迭代的集合,并使用。循环和迭代器手动遍历集合,并输出每个元素的值。接口表示一个可枚举的集合,它定义了一个方法。属性,用于获取集合中当前位置的元素。存储集合中的元素,并实现了。的泛型集合类,它实现了。
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行。因为遍历过程中进行remove 操作时,该位置后面的元素会挤到前面来,这时候会发生一种情况就是原来元素的位置会被他后面的元素取代,而该位置已经遍历过了,所以该元素不会背遍历。当我们倒序遍历元素的时候,无论删除元素之后的元素怎么移动,之前的元素对应的索引(index)是不会发生变化的,所以在删除元素的时候不会发生问题。_list删除某个元素
文章浏览阅读2.9w次,点赞45次,收藏192次。Windows下配置Visual Studio _vs2022环境变量配置
文章浏览阅读7w次,点赞162次,收藏778次。pip 是Python包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能,目前Python 3.4 和 2.7 及以上版本都有配套安装,一般pip的位置在...pythonScripts文件夹里面,而在其他版本需要自行下载。_python pip install安装
文章浏览阅读5.8k次,点赞2次,收藏12次。①此电脑右击----->选择属性----->高级系统设置----->环境变量----->path----->编辑----->新建。第一个选项意思就是将安装路径填入到系统环境变量中,这里勾选,后面使用可能会出现问题,建议不要勾选,安装好之后手动添加环境变量。注意:如果提示conda不是内部或外部命令,原因是Anaconda的环境变量没配置好。如果不想立即打开anaconda,不勾选直接finish就好。②输入 conda --version ,查看conda环境。②直接按win键,搜索“环境变量”_windows安装anaconda
文章浏览阅读5.1k次,点赞8次,收藏55次。Windows 系统从零配置 Python 环境,安装CUDA、CUDNN、PyTorch 详细教程_windows cuda cudnn配置
文章浏览阅读1.5w次,点赞54次,收藏68次。macOS系统自带有VNC远程桌面,我们可以在控制端上安装配置VNC客户端,以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制,为此,我们可以在macOS被控端上使用cpolar做内网穿透,映射VNC默认端口5900,通过所生成的公网地址,来实现在公网环境下远程控制VNC。_vnc mac
文章浏览阅读2.4k次,点赞5次,收藏11次。进入后根据自己的电脑系统下载,这是python 3.10版本下载地址,如果想要下载其它版本可进入此链接(下载完成后点击进行安装点击下一步,到这一步时,可以选择将Anaconda添加我的PATH环境变量中,这样就不用自己手动配置和环境变量。安装完成后,打开终端,输出 python 命令可查看是否安装成功。如果显示自己刚才安装的版本号说明安装成功。查看conda版本命令:conda info。_paddlespeech下载
文章浏览阅读3.3k次。所以如果要删除之前新增的课程编译原理,只需输入命令del Course:8:Cname,同时还应该把本课程的学分删除del Course:8:Ccredit,如下图所示;Redis并没有修改数据的命令,所以如果在Redis中要修改一条数据,只能在使用set命令时,使用同样的键值,然后用新的value值来覆盖旧的数据。先调用get命令,输出原先的值,然后set新的值,最后再get得到新值,所以修改成功。输入命令后没有报错,表示成功了,刷新windows的服务,多了一个redis服务。_redis windows服务
文章浏览阅读2.1w次,点赞9次,收藏56次。​​接着在【工作负荷】中,选择【使用C++桌面开发】 ,右边【安装详细信息】去除其它可选项,只勾选【MSVCv142 】和 【Windows 10 SDK】,按图示修改,然后右下角点击安装,之后会有提示让你重启电脑。重启电脑之后,再进行pip安装。报错原因是pip所安装的包需要使用C++编译后才能够正常安装,但是当前安装环境中缺少完整的C++编译环境,因此安装失败。3.安装Microsoft Visual C++ Build Tool离线安装包(1个多G),CSDN资源很多,需要积分下载,_error: microsoft visual c++ 14.0 or greater is required. get it with "micros
文章浏览阅读1.1w次,点赞3次,收藏7次。Step 3: 在右侧窗口中找到名称为“LongPathsEnabled”的“DWORD (32 位) 值”条目,并双击它。通过注册表方法或组策略方法启用长路径支持后,您将能够在 Windows 中使用长路径,并能够访问和处理长路径下的文件和文件夹。Step 2: 依次选择“计算机配置” > “管理模板” > “系统” > “文件资源管理器”。Step 3: 找到“启用 Win32 长路径”设置,双击它。Step 4: 选择“已启用”选项按钮,然后选择“应用”按钮。_windows长路径支持
文章浏览阅读2.5k次,点赞81次,收藏86次。
文章浏览阅读1.3k次,点赞65次,收藏50次。顺序表,链表,栈,队列,ArrayList,LinkedList,Stack,Queue
文章浏览阅读2.3k次,点赞2次,收藏2次。AnyTXTSearcher是一款能够帮助我们对文档以及文本内容进行快速搜索和管理的工具,通过该软件能够搜索各种Office文档,文本文件,代码,PDF文档等,顶级的全文搜索引擎1秒钟之内即可完成搜索。_anytxt searcher
文章浏览阅读8.8k次,点赞73次,收藏70次。有时,在删除/移动/重命名文件夹/文件时,会遇到如下警告,即使将打开的程序关闭了,后台也可能会有没关干净的相关进程。_解除占用
文章浏览阅读4.3w次,点赞91次,收藏102次。JDK(Java Development Kit)是Java开发工具包的缩写,包含了Java编译器、Java虚拟机、Java类库等众多组件,是Java开发的基石,提供了编写、编译和运行Java程序所必需的工具。同时,为了让系统能够正确识别Java环境,在开始使用JDK进行Java开发之前,需要先把JDK安装到本地计算机,并配置好相应的环境变量。本文将介绍JDK安装与环境变量配置的方法。_windows安装jdk并配置环境变量