这篇文章将为大家详细讲解有关span中设置text-indent不起作用如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:<p> <span>Test one</span> <span class="t-i">text-indent</span> <span>Test two</span> </p> 对span.t-i{text-indent:-999px;}后发现并没有起作用,这是因为text-indent只能给块级元素设置,但是如果让span{display:block}时,就会换行,还得通过浮动来控制,增加了麻烦,所以改css为span.t-i{text-indent:-999px;display:inline-block;}关于span中设置text-indent不起作用如何解决就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...
本篇文章为大家展示了CSS 中怎么设置文本字体颜色,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、认识CSS 颜色(CSS color)这里要介绍的是网页设置颜色包含有哪些;网页颜色规定规范。1、常用颜色地方包含:字体颜色、超链接颜色、网页背景颜色、边框颜色2、颜色规范与颜色规定:网页使用RGB模式颜色二、颜色基础知识网页中颜色的运用是网页必不可少的一个元素。使用颜色目的在于有区别、有动感(特别是超链接中运用)、美观之用,同时颜色也是各种各样网页的样式表现元素之一,了解CSS 字体颜色。传统的html颜色与w3c标准下的css颜色对比和DIV CSS运用颜色CSS color颜色语法:color:#000000;Css样式中color后直接加RGB颜色值(#FFFFFF 、#000000 、#F00)RGB颜色值在实际布局时候确定,可以使用Photoshop(简称PS)拾取工具进行获取获得。三、两种方法设置对象颜色样式1、在DIV标签内使用color颜色样式<div style="color:#F00">www.yisu.com</div>2、在CSS选择器中使用color颜色样式CSS代码:.divcss5{color:#00F}/* 设置对象divcss5内文字为蓝色 */扩展阅读:这里运用了CSS注释对此样式设置说明,了解CSS 注释3、DIV+CSS颜色样式完整案例:Css代码:代码如下:.divcss5{color:#00F}/* 设置对象divcss5内文字为蓝色 */ HTML代码:代码如下:<p> 标签内使用color css样式<div >www.yisu.com 红色</div> </p> <p>外部样式表设置对象color颜色<div class="divcss5">www.yisu.com 蓝色</div> </p> 4、实例结构图:以上使用标签内使用color颜色样式和css代码使用color颜色样式。四、文字颜色控制一样 传统html和css 文字颜色相同使用“color:”+“RGB颜色取值”即可,如颜色为黑色字即对应设置CSS属性选择器内添加“color:#000;”即可。五、网页背景颜色设置区别 传统设置背景颜色使用“bgcolor=颜色取值”,而CSS中则“background:”+颜色取值。例如:设置背景为黑色,传统Html设置,即在标签内加入“bgcolor="#000"”即可实现颜色为黑色背景,如果在W3C中即在对应CSS选择器中始终“background:#000”实现。六、设置边框颜色区别 传统“bordercolor=取值”,CSS中“border-color:”+颜色取值。例如:在传统html直接在table标签加入“bordercolor="#000"”即可,在现在CSS中设置“border-color:#000;”即可让边框颜色为黑色,同时记得对包括设置宽度和样式(虚线、实现)。DIV+CSS颜色值扩展知识:颜色值是一个关键字或一个数字的RGB规范。16个关键字是采取从Windows的VGA调色板: 水色 , 黑色 , 蓝色 , 紫红色 , 灰 , 绿 , 灰 , 褐红色 ,藏青色, 橄榄色 , 紫色 , 红色 , 银色 , 青色 , 白色 , 黄色 。七、RGB颜色给出了四种方法之一 1、#rrggbb( 如 ,#00cc00) (强烈推荐使用此表示颜色取值)2、#的RGB( 如 ,#0c0) 3、RGB(十中,x,x)的x是一个包容性的0和255之间的整数( 如 的RGB(0,204,0)) 4、RGB(Ÿ%,Ÿ%,Ÿ%),其中 y是一个包容性的数量介于0.0和100.0( 如 的RGB(0%,80%,0%))八、以下是RGB颜色表当然一般的网页开发软件都有颜色取值器: 网页开发软件DW软件中CSS取色器 如何获得CSS颜色值? 我们又不能记住颜色值,以及如何确定准确的与美工图相同颜色值呢?其实很简单通常我们是在PS软件里通过识色器工具进行获得准确颜色值,当然也可以借用其它专门识别颜色工具进行获取准确的color颜色值。 上述内容就是CSS 中怎么设置文本字体颜色,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...
今天就跟大家聊聊有关CSS中怎么设置字体尺寸,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用单位在CSS中可以用很多不同的方式来设定字体的尺寸。一般来说,这些单位被分成两大类:绝对单位(absolute)和相对单位(relative)。 绝对单位在大多数情况下是相对于某些实际量度而言的固定值,即是说它们一旦设定,就不会因为其他元素的字体尺寸变化而变化。 相对单位没有一个固定的度量值,而是由父元素尺寸来决定的相对值,它们的尺寸会根据与其相关的元素改变而改变。下面是对这些单位的一个简单整理:这里主要关注这几个单位:px、pt、%、em、rem和vw。它们之间有什么区别?从概念上很难理解这些单位之间的差别,所以下面用一些实例来说明。例1. 默认设定当你不设定字体尺寸时,HTML会提供一个默认的尺寸设定。大多数浏览器中<html>和<body>标签中的默认字体尺寸是100%,没有概念?看这个等式:CSS Code复制内容到剪贴板100% = 1em = 1rem = 16px = 12pt 还是不懂?那就换个说法,比如说你给一个<p>设置字体尺寸为100%,给另一个<p>设置为16px,在屏幕上看到的这两个<p>中的字体大小是一样的,下图列出了用几个不同单位设置的字体尺寸,可以看出是一样大的:例2. 绝对与相对改变<html>的字体尺寸可以很明显的看出绝对单位和相对单位的差别。如果把<html>设置为html { font-size: 200% },就会影响所有使用相对单位的<p>。效果如下图:这就是相对单位最主要的优势了,借助相对单位的这种特性就可以设计出真正的响应式页面,而所要做的只是修改<html>的字体尺寸例3. rem与em(或者%)em(或者%)需要通过父元素的字体尺寸来计算尺寸:CSS Code复制内容到剪贴板html { font-size: 100% /* =16px */ } body { font-size: 2em; /* =32px */ } p { font-size: 1em; /* =32px */ /* font-size: 0.5em; =16px */ } 因为<p>是<body>的子元素,而<body>是<html>的子元素,所以<p>中的em和%将是之前的两倍。当你为一个元素添加em单位时,应当考虑到所有父元素的字体尺寸。如你所见,这样很容易使人混乱。使用rem可以很好的解决这个问题。rem只需要计算<html>的字体尺寸而不需要考虑父元素。如下代码所示:CSS Code复制内容到剪贴板html { font-size: 100% /* =16px */ } body { font-size: 2rem; /* =32px */ } p { font-size: 1rem; /* =16px */ } 使用rem可以让你拥有和em/%同样的缩放能力,但不必去考虑那些复杂的嵌套关系。例4. Viewport宽度vw是CSS3中新提出的一个单位,通过Viewport宽度来计算字体尺寸。这样就可以设计出更加灵活的响应式字体。虽然这个单位看上去非常适合用于响应式设计,但就我个人而言不是很热衷于它。在使用vw的过程中我并不能很好的控制字体的大小,不是太大就是太小。我的方式当我在写这篇文章时,我仅使用px来作为单位。因为现在大多数浏览器都允许用户放大页面,这样做就不会有可访问性的问题。然而,我发现了这个具有一定限制力的方式。虽然我的字体尺寸在中小型屏幕上看起来还行,但在大屏幕上会被优化的更好。尽管用户可以自行设定放大的属性,但是我们希望可以尽量减少用户的工作。我的解决方案是使用rem,并使用px作为备用单位。CSS Code复制内容到剪贴板html { font-size: 62.5%; /* sets the base font to 10px for easier math */ } body { font-size: 16px; font-size: 1.6rem; /* sets the default sizing to make sure nothing is actually 10px */ } h2 { font-size: 32px; font-size: 3.2rem; } 像下面这样写就可以允许我按比例来放大我的字体尺寸:CSS Code复制内容到剪贴板@media screen and (min-width: 1280px) { html { font-size: 100%; } } 看完上述内容,你们对CSS中怎么设置字体尺寸有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注辰讯云资讯频道,感谢大家的支持。...
本篇内容主要讲解“在Centos中yum安装和卸载软件用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在Centos中yum安装和卸载软件用法”吧!安装一个软件时yum -y install httpd安装多个相类似的软件时yum -y install httpd*安装多个非类似软件时yum -y install httpd php php-gd mysql卸载一个软件时yum -y remove httpd卸载多个相类似的软件yum -y remove httpd*卸载多个非类似软件时yum -y remove httpd php php-gd mysql=======================================别的还有一个非常棒的用法假如我要执行iostat这个命令来查看CPU与 存储设备状态,可是执行却发现没有这个命令于是执行yum install iostat,结果说找不到该软件,使用下面的措施可以解决yum search iostat就能查到以及iostat相干的安装包了,别的想安装一个程序,只记得一部门名称,也可以用这个措施来实现安装yum search png |grep png就能找到我们想安装的libpng这个名称到此,相信大家对“在Centos中yum安装和卸载软件用法”有了更深的了解,不妨来实际操作一番吧!这里是辰讯云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!...
这篇文章给大家分享的是有关Java中Mybatis的面试题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. MyBatis 中 #{}和 ${}的区别是什么?#{}是预编译处理,${}是字符替换。 在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”, 配合 PreparedStatement 的 set 方法赋值,这样可以有效的防止 SQL 注入,保证程序的运行安全。2. MyBatis 有几种分页方式?逻辑分页: 使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。物理分页: 自己手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据的形式。3. MyBatis 逻辑分页和物理分页的区别是什么?逻辑分页是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。物理分页是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。4. MyBatis 是否支持延迟加载?延迟加载的原理是什么?MyBatis 支持延迟加载,设置 lazyLoadingEnabled=true 即可。 延迟加载的原理的是调用的时候触发加载,而不是在初始化的时候就加载信息。 比如调用 a. getB(). getName(),这个时候发现 a. getB() 的值为 null,此时会单独触发事先保存好的关联 B 对象的 SQL, 先查询出来 B,然后再调用 a. setB(b),而这时候再调用 a. getB(). getName() 就有值了,这就是延迟加载的基本原理5. 说一下 MyBatis 的一级缓存和二级缓存?一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。 开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。 缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。6. MyBatis 有哪些执行器(Executor)?MyBatis 有三种基本的Executor执行器:SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象;ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后不关闭 Statement 对象,而是放置于 Map 内供下一次使用。简言之,就是重复使用 Statement 对象;BatchExecutor:执行 update(没有 select,jdbc 批处理不支持 select),将所有 SQL 都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()完毕后,等待逐一执行 executeBatch()批处理,与 jdbc 批处理相同7. MyBatis 分页插件的实现原理是什么?分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 SQL,然后重写 SQL,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。8. MyBatis如何返回主键?核心在于 useGeneratedKeys和keyProperty属性<mapper namespace="org.chench.test.mybatis.mapper"> <!-- 插入数据:返回记录主键id值 --> <insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" > insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now()) </insert></mapper>9. Xml映射文件中,除了常见的select|insert|update|delete标签之外,还有哪些标签?还有很多其他的标签例如 sql|cach等...,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。10. MyBatis 和 Hibernate 的区别有哪些?灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便。可移植性:MyBatis 有很多自己写的 SQL,因为每个数据库的 SQL 可以不相同,所以可移植性比较差。学习和使用门槛:MyBatis 入门比较简单,使用门槛也更低。二级缓存:hibernate 拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。感谢各位的阅读!关于“Java中Mybatis的面试题有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...
这篇文章主要介绍了mysql内连接指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说明1、内部连接类似于自然连接,但内部连接不要求比较两个表的同名属性列,可以用on或using指定两个表比较的字段(比较的字段不要求同名)。2、内部连接的条件可以不写,此时查询的是笛卡尔积。实例# 表的内连接,内连接是结果集中只保留符合连接条件的记录-- 方法一SELECT e.empno,e.ename,d.dname-- 连接目标FROM t_emp e JOIN t_dept d-- 连接条件ON e.deptno=d.deptno; -- 方法二SELECT e.empno,e.ename,d.dname-- 连接目标FROM t_emp e,t_dept d-- 连接条件WHERE e.deptno=d.deptno; -- 内连练习一# 不同表的内连接# 查询每个员工的工号,姓名,部门名称,底薪,职位,工资等级SELECT e.empno,e.ename,d.dname,e.sal,e.job,s.gradeFROM t_emp e JOIN t_dept d ON e.deptno=d.deptnoJOIN t_salgrade s ON e.sal BETWEEN s.losal and s.hisal; # 相同表的内连接一# 查询Scott相同部门的员工都有谁SELECT e2.enameFROM t_emp e1 JOIN t_emp e2 ON e1.deptno=e2.deptnoWHERE e1.ename="SCOTT" AND e2.ename!="SCOTT"; # 相同表的内连接二# 查询底薪超过公司平均底薪的员工信息SELECT e.empno,e.ename,e.deptno,e.jobFROM t_emp e JOIN(SELECT avg(sal) as avgs FROM t_emp) tON e.sal>=t.avgs; # 查询RESEARCH部门的人数,最高底薪、最低底薪、平均底薪、平均工龄SELECT COUNT(*),MAX(e.sal),MIN(e.sal),AVG(e.sal),FLOOR(AVG((DATEDIFF(NOW(),e.hiredate)/365)))FROM t_emp e JOIN t_dept d ON e.deptno=d.deptnoWHERE d.dname="RESEARCH"; SELECT FLOOR(29.9) # 29SELECT CEIL(1.1) # 1.2 # 查询每种职业的最高工资、最低工资、平均工资、最高工资等级和最低工资等级SELECT e.job,MAX(e.sal+IFNULL(e.comm,0)),MIN(e.sal+IFNULL(e.comm,0)),AVG(e.sal+IFNULL(e.comm,0)),MAX(s.grade),MIN(s.grade)FROM t_emp e JOIN t_salgrade sON (e.sal+IFNULL(e.comm,0)) BETWEEN s.losal AND s.hisalGROUP BY e.job; # 查询每个底薪超过部门平均底薪的员工信息SELECT e.empno,e.ename,e.salFROM t_emp e JOIN(SELECT deptno,AVG(sal) as depsal FROM t_emp GROUP BY deptno) tON e.deptno=t.deptnoAND e.sal>depsal;感谢你能够认真阅读完这篇文章,希望小编分享的“mysql内连接指的是什么”这篇文章对大家有帮助,同时也希望大家多多支持辰讯云,关注辰讯云资讯频道,更多相关知识等着你来学习!...
小编给大家分享一下javascript怎么设置全局变量,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript设置全局变量的方法为:1、在js的function外定义变量;2、不使用var,直接给定义变量,隐式的声明了全局变量;3、使用“window.变量名”定义为全局变量。本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。三种方法1.在js的function外定义一个变量var name='测试';function XX(){ alert(name); }2.不使用var,直接给定义变量,隐式的声明了全局变量name='测试';function XX(){ alert(name); }这种方法,即使该变量是在一个function内,当该function被执行后它变成了全局变量 ---- 但是function不执行它就不被其他function知道,所以最好定义在function外3.使用window.变量名定义为全局变量,但是注意:调用时候建议写上window.变量名,当然也可以不写;我们常用的document.getXXX的document对象就是window的window.name='测试';function XX(){ alert(window.name); }全局变量的优点:可以减少变量的个数,减少由于实际参数和形式参数的数据传递带来的时间消耗。全局变量的缺点:(1)全局变量保存在静态存贮区,程序开始运行时为其分配内存,程序结束释放该内存。与局部变量的动态分配、动态释放相比,生存期比较长,因此过多的全局变量会占用较多的内存单元。(2)全局变量破坏了函数的封装性能。函数象一个黑匣子,一般是通过函数参数和返回值进行输入输出,函数内部实现相对独立。但函数中如果使用了全局变量,那么函数体内的语句就可以绕过函数参数和返回值进行存取,这种情况破坏了函数的独立性,使函数对全局变量产生依赖。同时,也降低了该函数的可移植性。(3)全局变量使函数的代码可读性降低。由于多个函数都可能使用全局变量,函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都非常不利。因此,如果不是万不得已,最好不要使用全局变量。以上是“javascript怎么设置全局变量”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
小编给大家分享一下Java中FileWriter如何实现输出换行操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!FileWriter输出换行使用Java的FileWriter写文件,需要换行时,假设已经新建FileWriter fr,在Windows操作系统中:fr.write("\n"); 是不行的,需要 fr.write("\r\n"); 即回车换行而在Linux系统中:只要 fr.write("\n"); 即可为了程序能在不同操作系统运行,可以写成fr.write(System.getProperty("line.separator"));FileWriter的换行和追加1.数据的换行\n可以实现换行,但是windows系统自带的记事本打开并没有换行,因为wiindows识别的换行不是\n,而是\r\n例如:fw.write("\r\n");[注]:windows:\r\nLinux:\nMac:\r2.数据的追加写入构造方法:FileWriter(String fileName,boolean append)例如:FileWriter fw = new FileWriter("a.txt",true); //表示追加写入,默认是false以上是“Java中FileWriter如何实现输出换行操作”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...
这篇文章主要讲解了“如何解决hosts文件修改完无效的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决hosts文件修改完无效的问题”吧! 当我们需要屏蔽某些恶意网站或访问特定网址以及在内网做测试的时候,常常需要修改hosts 文件,但是会发现有时修改完却总是不生效,而且Windows7系统和Vista系统、XP系统都会碰到此类情况,所以研究一下解决此类问题的办法。 一般在LINUX下修改完/etc/hosts文件都会立即生效的,即便偶尔不生效,只要重启一下network服务就可以了。但是windows却是会遇到这样的问题,而且在不同版本的系统中还略有区别。 在解决问题之前,让我们了解一下dns和hosts的知识。我们知道在访问网站时,首先要通过DNS服务器把要访问的域名解析成IP地址后,我们才能在浏览器中看到所访问网站的页面内容。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有网络域名的映射关系。如果有,则调用这个IP地址映射,如果没有再向已知的DNS服务器提出域名解析,也就是说Hosts的请求级别比DNS高。 下面说一下如何具体修改Hosts文件:首先要知道hosts文件的位置,在xp,2000,win7等系统中找到如下位置C:\windows\system32\drivers\etc,我们可以看到hosts文件,注意hosts文件是ascii编码方式,而且是没有后缀名的。其二正确修改hosts文件,一般hosts文件里面都会有个示例,比如 127.0.0.1 51cto.com 即代表打开51cto.com这个网址将解析到127.0.0.1,ip地址与网址间至少要有一空格,另外在最后一行书写映射时一定要加上回车再保存以避免最后一行不生效,如果某条记录暂时不用,只需要在它前面加一个#号即可。 hosts文件默认具有隐藏属性,系统默认设置情况下是看不到的,解决办法是打开我的电脑-点击工具-文件夹选项-查看-取消勾选隐藏受保护的系统文件,确定即可。如果修改后无法保存,请在Hosts文件上面点右键-属性-把只读属性去掉即可保存。 在修改HOSTS文件时候,还常常遇到修改保存后无效的情况,我们可以使用ipconfig /flushdns命令来刷新dns缓存, 或者也可以在管理工具中打开服务,找到“DNS Client”将其停用并改为手动模式在修改完hosts启动。 注意:当你在打开浏览器的情况下修改hosts文件时,关闭浏览器时系统才会释放掉hosts文件占用的那部分内存,我们再次打开浏览器访问就发现已经生效了。 如果遇到windows 7 操作系统无法打开和编辑的情况,一般是因为安全机制UAC造成的,你可以按着Shift键,然后Hosts文件上面右键,以管理员方式运行即可。或者修改Hosts文件权限,将当前登录的账号加入到安全选项卡中,赋予写入权。 还有一种方法就是打开本地连接的Internet(TCP/IP)协议的属性页,点击常规选项卡中的高级按钮,选择WINS选项卡,勾选“启用 LMHOSTS 查询”,接着按下“导入 LMHOSTS”按钮,导入hosts文件,这样再次启动浏览器时,就会发现hosts文件生效了。感谢各位的阅读,以上就是“如何解决hosts文件修改完无效的问题”的内容了,经过本文的学习后,相信大家对如何解决hosts文件修改完无效的问题这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是辰讯云,小编将为大家推送更多相关知识点的文章,欢迎关注!...
这篇文章将为大家详细讲解有关node.js中怎么对文件进行操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、文件操作在文件操作里,主要是有文件读写,创建、移动文件等。1.1 读取文件读取文本文件时,如.txt, .js, .json等文件,直接使用readFile就可以获取文件的内容。// server.jsvar fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){ if(err) throw err; console.log(data); });读取图片时,我们是不能直接输出到控制台中的,是需要创建一个服务器,然后在浏览器上进行查看。其实在上节中,我们已经了解过显示图片的过程了。// server.jsvar http = require('http'), fs = require('fs'); http.createServer(function(request, response){ // 使用二进制方式读取图片 fs.readFile('./img/test.png', 'binary', function(err, file){ if( err ) throw err; // 当前数据以image/png方式进行输出 response.writeHead(200, {"Content-Type": "image/png"}); response.write(file, 'binary'); response.end(); }); }).listen(3000);console.log('server has started...');打开浏览器:127.0.0.1:3000,就能看到图片了。1.2 写入文件将字符串写入到文件文件中,是非常简单的操作,使用writeFile即可搞定:var fs = require('fs');var data = '从一开始,就选择了做前端开发,因为觉得前端开发更贴近用户,能够倾听用户的声音,更好玩,更有意思,美的更直观。我们总是在尝试最新的技术,尝试更炫的效果,希望更能优化用户的体验效果!'; fs.writeFile('./test.txt', data, function(err){ if(err) throw err; console.log('写入数据成功...'); });writeFile方法,在没有文件时会创建文件并写入;若文件存在则内容被覆盖。1.3 创建或文件重命名根据writeFile的特性,可以使用writeFile写入空字符串的方式创建文件。同时,fs.open也可以创建文件:// 打开模式可以使用 w | w+ | a | a+// 这些模式在打开不存在的文件时,会创建文件// fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄fs.open(Date.now()+'.txt', 'a+', function(err, fd){ if(err) throw err; console.log(fd); })在文件系统中,有一个fs.rename的方法,顾名思义,对文件(文件夹)进行重命名。fs.rename(oldname, newname, callback(err));特性:将oldname文件(目录)移动至newname的路径下,并重新命名;如果oldname和newname是同一个路径,则直接进行重命名。二、文件夹操作通常对目录的操作比较简单一些。2.1 读取文件夹中的文件和文件夹列表使用fs.readdir(path, callback)可以获取path路径下的文件和目录列表,而且只能读取直接目录下的文件和文件夹,子目录里的是获取不到的。fs.readdir('./', function(err, files){ if(err) throw err; console.log( files ); });输出结果:[ 'img', 'msg.txt', 'node_modules', 'package.json', 'server.js', 'test.js', 'tmp' ]node_modules和tmp是文件夹,剩下的是文件,而且是获取不到node_modules和tmp里面的数据。获取一个目录下所有的文件,后面会讲解,稍等。2.2 删除文件夹使用fs.rmdir(path, callback)可以删除文件夹,但只能删除空文件夹,如果当前路径不是文件夹或当前文件夹不为空,则删除失败;删除的为空文件夹时,可以删除成功。fs.rmdir('./tmp', function(err){ if(err){ console.log('删除文件夹失败'); throw err; }else{ console.log('删除成功'); } })如何删除不为空的目录,后面会讲解,稍等。2.3 获取文件或文件夹的信息fs.stat(path, callback)能够获取path路径的信息,比如创建时间,修改时间,文件大小,当前是否为文件,当前是否为文件夹等信息;如果path路径不存在,则抛出异常。fs.stat('./test.js', function(err, stats){ if( err ){ console.log( '路径错误' ); throw err; } console.log(stats); console.log( 'isfile: '+stats.isFile() ); // 是否为文件 console.log( 'isdir: '+stats.isDirectory() ); // 是否为文件夹});结果:{ dev: -29606086, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 2251799813687343, size: 2063, // path路径为文件夹时,size为0 blocks: undefined, atime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间), mtime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), ctime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), birthtime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间)}isfile: true // 是否为文件isdir: false // 是否为文件夹关于这几个时间属性的理解,可以参考这篇文章。stats中的size属性就是当前文件的大小(单位:字节,除以1024即为kb),stats还有下面方法可供使用:stats.isFile()stats.isDirectory()stats.isBlockDevice()stats.isCharacterDevice()stats.isSymbolicLink() (only valid with fs.lstat())stats.isFIFO()stats.isSocket()fs.stat(path, callback)是异步执行的,对应的还有同步执行版本:fs.statSync(path) ,这个方法返回的就是fs.stats实例。三、综合运用我们在上面的讲解中,还留着两个功能没实现,这里实现一下它的过程。3.1 遍历目录中所有的文件我们已经知道使用readdir只能获取当前目录里的文件和文件夹名称,为了获取这个目录里所有的文件名称,只能是读取当前目录里所有的文件夹里的文件。这里我们使用递归的方法,如果当前资源是文件,则进行存储,是文件夹则进行递归进一步检索,直到把所有的文件夹遍历完毕。// 获取文件夹中所有的文件function readDirAll(path){ // 获取字符串的最后一个字符 var getLastCode = function(str){ return str.substr(str.length-1, 1); } var result = []; // 存储获取到的文件 var stats = fs.statSync(path); // 获取当前文件的状态 if( stats.isFile() ){ result.push(path); }else if( stats.isDirectory() ){ // 若当前路径是文件夹,则获取路径下所有的信息,并循环 var files = fs.readdirSync(path); for(var i=0, len=files.length; i<len; i++){ var item = files[i], itempath = getLastCode(path)=='/' ? path+item : path+'/'+item; // 拼接路径 var st = fs.statSync(itempath); if( st.isFile() ){ result.push(itempath); }else if( st.isDirectory() ){ // 当前是文件夹,则递归检索,将递归获取到的文件列表与当前result进行拼接 var s = readDirAll( itempath ); result = result.concat( s ); } } } return result; }console.log( readDirAll('./') );使用此程序获取当前目录中所有的文件(展示的为部分文件):[ './bing.doc', './img/1484234634801.png', './img/1484234660592.png', './img/test.png', './inter.js', './msg.txt', './node_modules/formidable/.npmignore', './node_modules/formidable/.travis.yml', './node_modules/formidable/index.js', './node_modules/formidable/lib/file.js', './node_modules/formidable/lib/incoming_form.js', './node_modules/formidable/lib/index.js', ... ]如果想要输出一种树形的结构,就可以对当前的递归程序进行改造,比如我想要输出如下的这种结果,那么,就要分析这种结构的特点:bing.doc img |---1484234634801.png |---1484234660592.png |---test.png inter.js msg.txt node_modules |---formidable |---.npmignore |---.travis.yml |---index.js |---lib |---file.js |---incoming_form.js |---index.js可以看出的规律:第一层级的文件和文件夹前面是没有空格和字符的;第一级子目录中的文件或文件夹前面是1组空格和1个字符;第二级子目录中的文件或文件夹前面是2组空格和1个字符;依次类推…我们可以再传递一个depth来表示当前目录的层级,然后计算出前面空格的数量:// depth为递归的深度,可根据递归的深度输出文件名称前面的格式function readDirAll(path, depth){ // 获取字符串 var getLastCode = function(str){ return str.substr(str.length-1, 1); } depth = depth || 0; // 默认为0 var fir_code = ''; // 计算文件名称前面的字符,4个空格为1组 for(var j=0; j<depth; j++){ fir_code += ' '; } depth && (fir_code += '|---'); var stats = fs.statSync(path); if( stats.isFile() ){ console.log( fir_code+path ); }else if( stats.isDirectory() ){ var files = fs.readdirSync(path); for(var i=0, len=files.length; i<len; i++){ var item = files[i], itempath = getLastCode(path)=='/' ? path+item : path+'/'+item, st = fs.statSync(itempath); console.log( fir_code+item ); if( st.isDirectory() ){ var s = readDirAll( itempath, depth+1 ); } } } }console.log( readDirAll('./') );3.2 删除目录使用fs.rmdir(path)是有局限性的,只能删除空目录,如果是个非空目录,我们可以根据上面的思路,写出一个能删除当前目录下所有的文件。递归,只要找到里面的文件夹就递归寻找,直到找到最底层,把最底层的文件删除,然后再逐级向上删除文件夹,直到删除到当前目录。// 删除path下所有的文件和文件夹,包括path自己function rmDirAll(path){ // 获取字符串 var getLastCode = function(str){ return str.substr(str.length-1, 1); } var stats = fs.statSync(path); // 获取当前文件的状态 if( stats.isFile() ){ fs.unlinkSync(path); console.log( '删除成功: '+path ); }else if( stats.isDirectory() ){ // 若当前路径是文件夹,则获取路径下所有的信息,并循环 var files = fs.readdirSync(path); for(var i=0, len=files.length; i<len; i++){ var item = files[i], itempath = getLastCode(path)=='/' ? path+item : path+'/'+item; // 拼接路径 var st = fs.statSync(itempath); if( st.isFile() ){ fs.unlinkSync(itempath); console.log( '删除成功: '+itempath ); }else if( st.isDirectory() ){ // 当前是文件夹,则递归检索 rmDirAll( itempath ); } } // 现在可以删除文件夹 fs.rmdir(path); console.log( '删除成功: '+path ); } } rmDirAll('./img');则删除时输出的信息如下,先把内部的文件和文件夹删除干净,最后删除 ‘./img':删除成功: ./img/1484234634801.png 删除成功: ./img/1484234660592.png 删除成功: ./img/gggg/est.txt 删除成功: ./img/gggg 删除成功: ./img/test.png 删除成功: ./img当然,你也可以试着实现这样的程序:删除path内部所有的内容,同时能保留下path目录只删除文件,将所有的空文件夹保留下来将内部所有的文件都移动到path的根目录下,并删除空文件夹关于node.js中怎么对文件进行操作就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...