我曾经试过使用JSAjaxFileUploader插件来把文件、照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传"中说的,这种方法足够轻、足够好。但今天,要在前面的基础上再增加2个需求:

1、异步判断上传的图片是否超过最大限制
2、把上传的图片裁剪成大中小3张图片,分别保存,删除的时候一块被删除

上传图片如果超出最大尺寸限制,终止上传,并报错误信息。

前台上传图片,显示缩略图。

在项目根目录下的指定文件夹AjaxUpload中同时有了大中小3张图片。

点击图片行的删除按钮或重新上传新的图片,原先的大中小3张图片一块被删除。重新上传新图片:

在项目根目录下的指定文件夹AjaxUpload中同时有了新的大中小3张图片。

前端还是使用JSAjaxFileUploader插件,后端使用ImageResizer组件实现对图片的裁剪和保存。

当前端拿到异步请求的返回结果后,需要显示图片、记录下图片的名称、错误信息等,可以把这些信息封装到UploadFileResult类中,让服务端以json格式返回。

http://www.cnblogs.com/namespace MvcApplication1.Models
{
    http://www.cnblogs.com/public http://www.cnblogs.com/class UploadFileResult
    {
        http://www.cnblogs.com/public http://www.cnblogs.com/string LargeFileName { http://www.cnblogs.com/get; http://www.cnblogs.com/set; } http://www.cnblogs.com///带后缀名的图片名称,比如:20141112_large.jpg
        http://www.cnblogs.com/public http://www.cnblogs.com/string MediumFileName { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }
        http://www.cnblogs.com/public http://www.cnblogs.com/string SmallFileName { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }
        http://www.cnblogs.com/public http://www.cnblogs.com/int Length { http://www.cnblogs.com/get; http://www.cnblogs.com/set; } http://www.cnblogs.com///图片的字节数
        http://www.cnblogs.com/public http://www.cnblogs.com/string Type { http://www.cnblogs.com/get; http://www.cnblogs.com/set; } http://www.cnblogs.com///图片的类型:image/jpeg
        http://www.cnblogs.com/public http://www.cnblogs.com/bool IsValid { http://www.cnblogs.com/get; http://www.cnblogs.com/set; } http://www.cnblogs.com///用来判断是否超过尺寸最大限制
        http://www.cnblogs.com/public http://www.cnblogs.com/string Message { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }
        http://www.cnblogs.com/public http://www.cnblogs.com/string LargeFilePath { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }  http://www.cnblogs.com///图片的保存路径:~/AjaxUpload/20141112_large.jpg
        http://www.cnblogs.com/public http://www.cnblogs.com/string MediumFilePath { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }
        http://www.cnblogs.com/public http://www.cnblogs.com/string SmallFilePath { http://www.cnblogs.com/get; http://www.cnblogs.com/set; }
    }
}

以上,
○ LargeFileName用来保存裁剪大图的名称,类似"20141112_large.jpg",当前台需要删除图片的时候,还需要把这个图片名称传递给服务端,再到指定文件夹删除图片。
○ LargeFilePath用来保存图片的路径,类似"~/AjaxUpload/20141112_large.jpg",前台显示图片的时候需要这个。
○ IsValid为true表示可以裁剪保存图片,为false表示超过最大的尺寸限制,取消上传

通过NuGet安装ImageResizer。安装完后,在"引用"下面多了一个ImageResizer组件。

创建HomeController,主要完成以下工作:
1、接收前台上传图片,裁剪成大中小图片并分别保存
2、接收前台需要删除的图片名称,在指定文件夹中同时删除大中小图片
3、提供递归统计指定文件夹大小的方法
......

http://www.cnblogs.com/using System;
http://www.cnblogs.com/using System.Collections.Generic;
http://www.cnblogs.com/using System.IO;
http://www.cnblogs.com/using System.Web;
http://www.cnblogs.com/using System.Web.Mvc;
http://www.cnblogs.com/using ImageResizer;
http://www.cnblogs.com/using MvcApplication1.Models;

http://www.cnblogs.com/namespace MvcApplication1.Controllers
{
    http://www.cnblogs.com/public http://www.cnblogs.com/class HomeController : Controller
    {

        http://www.cnblogs.com/public ActionResult Index()
        {
            http://www.cnblogs.com/return View();
        }

        [HttpPost]
        http://www.cnblogs.com/public ActionResult UploadFile()
        {
            http://www.cnblogs.com///需要返回给前台的结果
            List<UploadFileResult> results = http://www.cnblogs.com/new List<UploadFileResult>();

            http://www.cnblogs.com///遍历从前台传递而来的文件
            http://www.cnblogs.com/foreach (http://www.cnblogs.com/string file http://www.cnblogs.com/in Request.Files)
            {
                http://www.cnblogs.com///把每一个上传文件封装成HttpPostedFileBase
                HttpPostedFileBase hpf = Request.Files[file] http://www.cnblogs.com/as HttpPostedFileBase;

                http://www.cnblogs.com///如果前台传来的文件集合中有null,继续遍历其他文件
                http://www.cnblogs.com/if (hpf.ContentLength == 0 || hpf == http://www.cnblogs.com/null)
                {
                    http://www.cnblogs.com/continue;
                }

                http://www.cnblogs.com///给上传文件改名
                http://www.cnblogs.com/string date = DateTime.Now.ToString("http://www.cnblogs.com/yyyyMMddhhmmss");

                http://www.cnblogs.com///目标文件夹的相对路径 ImageSize需要的格式
                http://www.cnblogs.com/string pathForSaving = Server.MapPath("http://www.cnblogs.com/~/AjaxUpload/");

                http://www.cnblogs.com///目标文件夹的相对路径 统计文件夹大小需要的格式
                http://www.cnblogs.com/string pathForSaving1 = Server.MapPath("http://www.cnblogs.com/~/AjaxUpload");

                http://www.cnblogs.com///保存文件并返回结果
                http://www.cnblogs.com/if (http://www.cnblogs.com/this.CreateFolderIfNeeded(pathForSaving))
                {
                    http://www.cnblogs.com/long currentSize = GetDirectoryLength(pathForSaving1);

                    http://www.cnblogs.com///如果大于最大限制,直接返回json信息
                    http://www.cnblogs.com///1M=1024*1024个字节
                    http://www.cnblogs.com/if (currentSize + hpf.ContentLength > 50 * 1024 * 1024)http://www.cnblogs.com///最大允许50兆
                    {
                        results.Add(http://www.cnblogs.com/new UploadFileResult()
                        {
                            LargeFileName = "http://www.cnblogs.com/",
                            LargeFilePath = "http://www.cnblogs.com/",
                            MediumFileName = "http://www.cnblogs.com/",
                            MediumFilePath = "http://www.cnblogs.com/",
                            SmallFileName = "http://www.cnblogs.com/",
                            SmallFilePath = "http://www.cnblogs.com/",
                            IsValid = http://www.cnblogs.com/false,
                            Length = hpf.ContentLength,
                            Message = "http://www.cnblogs.com/超过最大限制无法上传",
                            Type = hpf.ContentType
                        });
                    }
                    http://www.cnblogs.com/else http://www.cnblogs.com///如果小于最大限制,才保存大中小图片
                    {
                        http://www.cnblogs.com///保存图片的各种版本:小图,中图,大图
                        var versions = http://www.cnblogs.com/new Dictionary<http://www.cnblogs.com/string, http://www.cnblogs.com/string>();
                        versions.Add("http://www.cnblogs.com/_small", "http://www.cnblogs.com/maxwidth=50&maxheight=50&format=jpg");
                        versions.Add("http://www.cnblogs.com/_medium", "http://www.cnblogs.com/maxwidth=200&maxheight=200&format=jpg");
                        versions.Add("http://www.cnblogs.com/_large", "http://www.cnblogs.com/maxwidth=600&maxheight=600&format=jpg");

                        http://www.cnblogs.com///保存各个版本的缩略图
                        http://www.cnblogs.com/foreach (var key http://www.cnblogs.com/in versions.Keys)
                        {
                            hpf.InputStream.Seek(0, SeekOrigin.Begin);
                            ImageBuilder.Current.Build(http://www.cnblogs.com/new ImageJob(
                                hpf.InputStream,
                                pathForSaving + date + key, http://www.cnblogs.com///不带后缀名的图片名称
                                http://www.cnblogs.com/new Instructions(versions[key]),
                                http://www.cnblogs.com/false,http://www.cnblogs.com///是否保留原图
                                http://www.cnblogs.com/true));http://www.cnblogs.com///是否增加后缀
                        }


                        results.Add(http://www.cnblogs.com/new UploadFileResult()
                        {
                            LargeFileName = date + "http://www.cnblogs.com/_large" + "http://www.cnblogs.com/.jpg",
                            LargeFilePath = Url.Content(String.Format("http://www.cnblogs.com/~/AjaxUpload/{0}", date + "http://www.cnblogs.com/_large" + "http://www.cnblogs.com/.jpg")),
                            MediumFileName = date + "http://www.cnblogs.com/_medium" + "http://www.cnblogs.com/.jpg",
                            MediumFilePath = Url.Content(String.Format("http://www.cnblogs.com/~/AjaxUpload/{0}", date + "http://www.cnblogs.com/_mediume" + "http://www.cnblogs.com/.jpg")),
                            SmallFileName = date + "http://www.cnblogs.com/_small" + "http://www.cnblogs.com/.jpg",
                            SmallFilePath = Url.Content(String.Format("http://www.cnblogs.com/~/AjaxUpload/{0}", date + "http://www.cnblogs.com/_small" + "http://www.cnblogs.com/.jpg")),
                            IsValid = http://www.cnblogs.com/true,
                            Length = hpf.ContentLength,
                            Message = "http://www.cnblogs.com/上传成功",
                            Type = hpf.ContentType
                        });
                    }

                }
            }

            http://www.cnblogs.com///单文件上传,实际上results中只有一个元素
            http://www.cnblogs.com/return Json(http://www.cnblogs.com/new
            {
                largename = results[0].LargeFileName,
                largepath = results[0].LargeFilePath,
                mediumname = results[0].MediumFileName,
                mediumpath = results[0].MediumFilePath,
                smallname = results[0].SmallFileName,
                smallpath = results[0].SmallFilePath,
                type = results[0].Type,
                size = http://www.cnblogs.com/string.Format("http://www.cnblogs.com/{0} bytes", results[0].Length),
                msg = results[0].Message,
                isvalid = results[0].IsValid
            });
        }


        http://www.cnblogs.com///根据文件名称删除文件
        [HttpPost]
        http://www.cnblogs.com/public ActionResult DeleteFileByNames(http://www.cnblogs.com/string largename, http://www.cnblogs.com/string mediumname, http://www.cnblogs.com/string smallname)
        {
            http://www.cnblogs.com/string pathForSaving = Server.MapPath("http://www.cnblogs.com/~/AjaxUpload");
            System.IO.File.Delete(Path.Combine(pathForSaving, largename));
            System.IO.File.Delete(Path.Combine(pathForSaving, mediumname));
            System.IO.File.Delete(Path.Combine(pathForSaving, smallname));
            http://www.cnblogs.com/return Json(http://www.cnblogs.com/new
            {
                msg = http://www.cnblogs.com/true
            });
        }

        http://www.cnblogs.com//// <summary>
        http://www.cnblogs.com//// 根据目标文件夹的相对路径创建文件夹
        http://www.cnblogs.com//// 如果目标文件夹不存在,就创建;存在就不创建
        http://www.cnblogs.com//// 只有在创建目标文件夹发生异常的时候才返回false
        http://www.cnblogs.com//// </summary>
        http://www.cnblogs.com//// <param name="path">目标文件夹的相对路径</param>
        http://www.cnblogs.com//// <returns></returns>
        http://www.cnblogs.com/private http://www.cnblogs.com/bool CreateFolderIfNeeded(http://www.cnblogs.com/string path)
        {
            http://www.cnblogs.com/bool result = http://www.cnblogs.com/true;
            http://www.cnblogs.com/if (!Directory.Exists(path))
            {
                http://www.cnblogs.com/try
                {
                    Directory.CreateDirectory(path);
                }
                http://www.cnblogs.com/catch (Exception)
                {
                    result = http://www.cnblogs.com/false;
                }
            }
            http://www.cnblogs.com/return result;
        }

        http://www.cnblogs.com//// <summary>
        http://www.cnblogs.com//// 根据目标文件夹的相对路径递归计算该文件夹的大小
        http://www.cnblogs.com//// </summary>
        http://www.cnblogs.com//// <param name="path">用相对路径表示的目标文件夹</param>
        http://www.cnblogs.com//// <returns></returns>
        http://www.cnblogs.com/private http://www.cnblogs.com/static http://www.cnblogs.com/long GetDirectoryLength(http://www.cnblogs.com/string path)
        {
            http://www.cnblogs.com///如果目标文件夹不存在就返回0
            http://www.cnblogs.com/if (!Directory.Exists(path))
            {
                http://www.cnblogs.com/return 0;
            }

            http://www.cnblogs.com/long size = 0;

            http://www.cnblogs.com///获取目标文件夹的信息
            DirectoryInfo di = http://www.cnblogs.com/new DirectoryInfo(path);

            http://www.cnblogs.com///遍历目标文件夹下的所有文件遍历累计每个文件的大小
            http://www.cnblogs.com/foreach (FileInfo fi http://www.cnblogs.com/in di.GetFiles())
            {
                size += fi.Length;
            }

            http://www.cnblogs.com///获取目标文件夹下的所有子文件夹
            DirectoryInfo[] dis = di.GetDirectories();

            http://www.cnblogs.com///如果确实有子文件夹
            http://www.cnblogs.com/if (dis.Length > 0)
            {
                http://www.cnblogs.com///遍历这些子文件夹
                http://www.cnblogs.com/for (http://www.cnblogs.com/int i = 0; i < dis.Length; i++)
                {
                    http://www.cnblogs.com///递归统计累计大小
                    size += GetDirectoryLength(dis[i].FullName);
                }
            }

            http://www.cnblogs.com/return size;
        }
    }
}

以上,
○ UploadFile方法中,通过Request.Files拿到所有的上传图片,然后遍历这些图片,通过Request.Files[key]获取某个图片,把该图片转换成HttpPostedFileBase类型。在裁剪保存图片之前,使用GetDirectoryLength方法获取当前文件夹的尺寸,如果没有超过尺寸的最大限制,就使用ImageResizer把图片裁剪成大中小3张图片,并分别保存。

○ DeleteFileByNames方法中,从前台接收大中小图片的名称,再到根目录下的指定文件夹AjaxUpload中删除大中小3张图片。

_Layout.cshtml中引入相关css、js文件。JQuery.JSAjaxFileUploaderSingle.js文件已经做了汉化,详细参考这里

<head>
    <meta charset="http://www.cnblogs.com/utf-8" />
    <meta name="http://www.cnblogs.com/viewport" content="http://www.cnblogs.com/width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("http://www.cnblogs.com/~/Content/css")
    <link href="http://www.cnblogs.com/~/Content/JSAjaxFileUploader/JQuery.JSAjaxFileUploader.css" rel="http://www.cnblogs.com/stylesheet" />
    @Scripts.Render("http://www.cnblogs.com/~/bundles/modernizr")
    @Scripts.Render("http://www.cnblogs.com/~/bundles/jquery")
    <script src="http://www.cnblogs.com/~/JSAjaxFileUploader/JQuery.JSAjaxFileUploaderSingle.js"></script>
</head>
<body>
    @RenderBody()
    @RenderSection("http://www.cnblogs.com/scripts", required: http://www.cnblogs.com/false)
</body>

创建Home/Index.cshtml视图,主要工作包括:
1、处理图片上传,每次上传前需要把原先的3张图片删除,如果上传成功显示小图的缩略图,如果上传失败,给出错误提示。
2、提供一个动态创建图片行表格的方法
3、提供一个删除大中小图片的方法,向服务端发送3张图片的名称
......

@{
    ViewBag.Title = "http://www.cnblogs.com/Index";
    Layout = "http://www.cnblogs.com/~/Views/Shared/_Layout.cshtml";
}

<style type="http://www.cnblogs.com/text/css">
    #tb table {
        border-collapse: collapse;
        width: 600px;
    }

    #tb td {
        text-align: center;
        padding-top: 5px;
        width: 25%;
    }

    #tb tr {
        background-color: #E3E3E3;
        line-height: 35px;
    }

    .limit {
        color: red;
    }
</style>

<div id="http://www.cnblogs.com/testId"></div>

<div id="http://www.cnblogs.com/tb">
    <table id="http://www.cnblogs.com/tbl">
        <tbody>
        </tbody>
    </table>
</div>

<div>
    <span http://www.cnblogs.com/class="http://www.cnblogs.com/limit"></span>
</div>

@section scripts
{
    <script type="http://www.cnblogs.com/text/javascript">
        $(function() {
            http://www.cnblogs.com///隐藏显示图片的表格
            $('#tbl').hide();

            http://www.cnblogs.com///图片上传
            $('#testId').JSAjaxFileUploader({
                uploadUrl: '@Url.Action("http://www.cnblogs.com/UploadFile","http://www.cnblogs.com/Home")',
                inputText: '选择上传文件',
                http://www.cnblogs.com///fileName: 'photo',
                maxFileSize: 512000,    http://www.cnblogs.com///Max 500 KB file 1kb=1024字节
                allowExt: 'gif|jpg|jpeg|png',
                zoomPreview: http://www.cnblogs.com/false,
                zoomWidth: 360,
                zoomHeight: 360,
                beforesend: function (file) {http://www.cnblogs.com///每次点击都要删除原先的
                    http://www.cnblogs.com/if ($('.largeImgName').text() != "http://www.cnblogs.com/" && $('.mediumImgName').text() != "http://www.cnblogs.com/" && $('.smallImgName').text() != "http://www.cnblogs.com/") {
                        deleteImg();
                        $('#tbl').hide();
                    }
                },
                success: function (data) {
                    http://www.cnblogs.com/if (!data.isvalid) { http://www.cnblogs.com///如果尺寸超过最大限制
                        $('.limit').css("http://www.cnblogs.com/display", "http://www.cnblogs.com/block");
                        $('.limit').text(data.msg);
                        http://www.cnblogs.com/return;
                    } http://www.cnblogs.com/else {
                        $('.limit').css("http://www.cnblogs.com/display", "http://www.cnblogs.com/none");
                        createTableTr();
                        $('#tbl').show();
                        $('.showImg').attr("http://www.cnblogs.com/src", data.smallpath);http://www.cnblogs.com///显示小图片
                        $('.largeImgName').text(data.largename); http://www.cnblogs.com///显示大图的名称
                        $('.mediumImgName').text(data.mediumname); http://www.cnblogs.com///显示中图的名称
                        $('.smallImgName').text(data.smallname); http://www.cnblogs.com///显示小图的名称
                    }
                },
                error: function (data) {
                    alert(data.msg);
                }
            });

            http://www.cnblogs.com///点击删除链接删除刚上传图片
            $('#tbl').on("http://www.cnblogs.com/click", "http://www.cnblogs.com/.delImg", function () {
                deleteImg();
                http://www.cnblogs.com///window.location.reload();
            });
        });

        http://www.cnblogs.com///创建表格
        function createTableTr() {
            var table = $('#tbl');
            table.append("http://www.cnblogs.com/<tr><td><img class='showImg'/></td><td colspan='2'><span class='largeImgName'></span><br/><span class='mediumImgName'></span><br/><span class='smallImgName'></span></td><td><a class='delImg' href='javascript:void(0)'>删除</a></td></tr>");
        }

        http://www.cnblogs.com///删除图片方法:点击删除链接或上传新图片删除原先图片用到
        function deleteImg() {
            $.ajax({
                cache: http://www.cnblogs.com/false,
                url: '@Url.Action("http://www.cnblogs.com/DeleteFileByNames", "http://www.cnblogs.com/Home")',
                type: "http://www.cnblogs.com/POST",
                data: { largename: $('.largeImgName').text(), mediumname: $('.mediumImgName').text(), smallname: $('.smallImgName').text() },
                success: function (data) {
                    http://www.cnblogs.com/if (data.msg) {
                        http://www.cnblogs.com///alert("图片删除成功");
                        $('.delImg').parent().parent().remove();
                    }
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    alert("http://www.cnblogs.com/出错了 '" + jqXhr.status + "http://www.cnblogs.com/' (状态: '" + textStatus + "http://www.cnblogs.com/', 错误为: '" + errorThrown + "http://www.cnblogs.com/')");
                }
            });
        }
    </script>
}

ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上传目录的尺寸限制的更多相关文章

  1. [备忘]Asp.net MVC 将服务端Model传递的对象转为客户端javascript对象

    <script type="text/javascript"> var jsObject = @Html.Raw(Json.Encode(Model.Objects)) ...

  2. Highcharts结合PhantomJS在服务端生成高质量的图表图片

    项目背景 最近忙着给部门开发一套交互式的报表系统,来替换原有的静态报表系统. 老系统是基于dotnetCHARTING开发的,dotnetCHARTING的优势是图表类型丰富,接口调用简单,使用时只需 ...

  3. Asp.net SignalR 实现服务端消息推送到Web端

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

  4. asp.net core webapi 服务端配置跨域

    在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...

  5. Asp.net SignalR 实现服务端消息实时推送到所有Web端

    ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加 ...

  6. 数往知来 ASP.NET 模拟服务器:服务端_静态页面_动态页面的响应<十七>

      一.客户端是怎么看到我们的网页的呢/ 在浏览器端,如果用汉语请求的是一普通的HTML网页,呢么我们的IIS服务器, 接收到请求以后,那么从IIS服务器所在的电脑区查找该HTML网页, 找到以后将该 ...

  7. asp.net MVC发布iis无法加载css,js和图片

    今天真够郁闷的,遇到了在本地能运行的项目到了iis服务器那里就不行了,无法加载css,js和图片,这里说清楚一下先,关于asp.net 的MVC中这样的情况其实不少,但是之前遇到的是在visual s ...

  8. ASP.NET MVC 5 局部视图不支持异步问题

    [ChildActionOnly] public async Task<ActionResult> TopLeftFlowPartialView() { var user = Sessio ...

  9. ASP.NET MVC 使用jquery.form.js 异步上传 在IE下返回值被变为下载的解决办法

    错误记录: <script type="text/javascript"> $(function () { $(document).off("ajaxSend ...

随机推荐

  1. 微信 关闭手机微信内置浏览器的js

    WeixinJSBridge.call('closeWindow');

  2. 表视图控制器(TableViewController)(三) 、 表视图搜索

    1 乐库的设置界面 1.1 问题 tableView分为静态(static)和动态(dynamic),之前使用的都是动态的tableView,表视图的有多少分区.有多少行以及每一行显示的内容都不是固定 ...

  3. 查询语句中select from where group by having order by的执行顺序

    查询语句中select from where group by having order by的执行顺序   1.查询中用到的关键词主要包含六个,并且他们的顺序依次为  select--from--w ...

  4. Weblogic项目部署及数据源配置

    号线项目总结: weblogic项目配置: 把工作区放到磁盘上,建立weblogic域 在安装的weblogic服务器的开始项里选择 进入weblogic域的建立. 建立完域后用Myeclipse打开 ...

  5. Ubuntu 改变workspace布局

    今天花了点时间找ubuntu的workspace布局.发现一个软件,tweak, 非常好用,可以随意调整布局. Ref: http://ubuntuhandbook.org/index.php/201 ...

  6. 137. Single Number II

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  7. 235. Lowest Common Ancestor of a Binary Search Tree

    代码如下: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; ...

  8. C陷阱与缺陷 1

    1,符号之间的空白被忽略 符号中间不能嵌入空白 2,词法分析中的贪心法 a---b 和 a-- -b相同 和 a- --b不同 1 a=b/*p //根据贪心法 /*被解释成 注释符,便不再往下读,直 ...

  9. vim编辑器的基本操作

    1.安装vim编辑器 最小化安装的linux是没有vim编辑器的,需要手动安装 # yum -y install vim-enhanced # vim +2 123 直接到123的第2行 2.vim的 ...

  10. ISBN号码

    总时间限制:  1000ms 内存限制:  65536kB 描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx- ...