node文件模块

概述

  • 文件操作的同步与异步
  • 对文件的读写操作
  • 从指定位置开始读写文件
  • 创建与读取目录
  • 查看文件或目录信息
  • 其它操作
  • 文件流

文件操作的同步与异步

所有文件、目录的创建、读取、删除操作都有同步和异步两种方式,同步方式方法名后有 Sync

1
2
3
4
5
6
7
8
9
10
11
12
let fs = require('fs');
fs.readFile(__dirname + '/index.md',(err,stdout,stderr){
if(err){
console.log(stderr);
return;
}
console.log('异步读取文件', stdout);
}; //异步方式


let data = fs.readFileSync(__dirname + 'index.md');
console.log('同步方式读取文件', data);

对文件的读写操作

完整读写

读取

readFile(path, {encoding:’’,flag:’’}, callback(err, data)):完整读取文件
encoding: utf8, ascii, base64; 默认二进制
flag:

1
2
3
4
5
6
7
8
9
10
11
12
r, 读取文件,不存在则抛出异常
r+,读写方式,文件不存在则抛出异常
rs, 同步方式读取,忽略本地缓存,文件不存在则抛出异常
rs+, 同步读取写入
w, 写入文件,不存在则创建,存在则清空
wx, 排他式写入文件
w+, 读取并写入
wx+, 读取并写入,拍他式
a, 追加写入文件,不存在则创建
ax, 排他式写入
a+, 读取并追加
ax+ 读取并追加,排他式

写入

fs.writeFile(path, data, [options], callback)

1
2
3
4
5
option:{
flag:'',
encoding: 'utf8', //utf8, ascii, base64
mode:'' //对文件的读写权限,默认为0666
}

mode:第一位为 0,第二位为文件或目录所有者的权限, 第三个为文件或目录所有者所属用户组的权限, 第四个为其他人权限
数字所对应的权限:

  • 1:执行权限
  • 2:写权限
  • 3:读权限
    fs.writeFileSync(); 同步版本的 writeFile()

fs.appendFile(fileName, data, [options], callback) // 在文件地步追加写入数据,文件不存在则创建文件
options 中 flag 默认为 a

同步版:appendFileSync()

从指定位置开始读写文件

读取文件

fs.open(filename, flags, [mode], callback(err, fd)),fd 是文件句柄。同步版:fs.openSync() //106 行
文件句柄用于 read 、 readSync、 write 、writeSync 方法

fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))

  • buffer 是存储读取数据的缓冲池;
  • offset 是存储池中开始存储时的偏移字节数;
  • length 需要读取的字节数;
  • position 读取文件的开始位置 以字节为单位;
  • bytesRead 实际读取到的字节数,在 length + position 大于文件长度时 bytesRead !== length

同步读取:readSync()返回实际读取到的字节数

写入文件

fs.write(fd, buffer, offset, length, position,callback(err, writeen, buffer))

  • written: 被写入的字节数
  • buffer: 被读取的缓冲区对象 和 write 参数里的 buffer 相同

同步版: writeSync();

关闭文件

fs.close(fd, callback)
同步版本:fs.closeSync(fd)
fs.fsync(fd, callback) 同步缓存中的数据到文件
fs.fsyncSync(fd) 同步版本的 fsync

创建与读取目录

fs.mkdir(path, [mode], callback(err))

  • mode 默认 0777
    mkdirSync();

fs.readdir(path, callback(err, files))
fs.readdirSync()

查看文件或目录信息

fs.stat(path, callback(err, stats)),fs.lstat(path, callback(err, stats))两者基本相同,lstat 不能查看符号链接文件信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
stats对象:{
isFile(),
isDirectory(),
isBlockDevice(),
isCharacterDevice() ,是否是字符设备文件
mode
nlink 硬链接数量
uid 文件所有者ID
gid 文件所有者所在组的ID
rdev
blksize
ino
size 文件字节数
blocks
atimeMs
mtimeMs
ctimeMs
birthtimeMs
atime 文件访问时间
mtime 文件修改时间
ctime 文件创建时间
birthtime
_checkModeProperty
isDirectory
isFile
isBlockDevice
isCharacterDevice
isSymbolicLink
isFIFO
isSocket
}

同步版:fs.statSync fs.lstatSync

使用 open 和 openSync 打开的文件使用 fs.fstat(fd,callback)访问信息,同步版为 fs.fstatSync

检查文件或目录是否存在

fs.exists(path, callback(exists)) 回掉函数的参数为布尔值,文件存在则为 true
同步版本:fs.existsSync

获取绝对路径

fs.realpath(path,[cache],callback(err, resolvedPath))
cache 是预先指定的路径对象:{‘/etc’: ‘/somepath/etc’}
同步版: fs.realpathSync()

修改文件访问时间和修改时间

fs.utimes(path, atime, mtime, callback(err))
使用 open 打开的文件时间修改使用:fs.futimes(fd, atime, mtime, callback)

修改文件或目录的读写权限

fs.chmod(path, mode, callback(err))
fs.fchomd(fd, mode, callback) 使用 open 打开的文件

其他操作 P118

移动文件或目录

fs.rename(oldname, newname, callback(err))

硬链接操作

_硬链接_:实际上就是文件名,通过特殊操作可以为文件创造多个文件名即多个硬链接

创建硬链接

1
2
3
4
fs.link(srcpath, dstpath,callback(err))
srcpath为需要创建硬链接的文件的路径及文件名,dstpath与srcpath必须在同一卷中

linkSync同步版

删除硬链接

1
fs.unlink(path,callback(err)); // 当删除的硬链接是文件的最后一个硬链接时等同于删除文件

符号链接

符号链接亦称软链接,是一种仅包含另一个文件或目录的路径及文件名或目录名的特殊文件

1
2
3
4
5
6
7
// 创建
fs.symlink(srcpath, dstpath, [type], callback)
// type 为符号链接的类型默认为 file ,目录类型为 dir

// 读取
fs.readlink(path, callback(err, linkString))
// 读取链接中所包含的另一个文件或目录的路径及文件名或目录名

截断文件

文件截断是先清楚文件内容,然后修改文件尺寸的操作

1
2
3
fs.truncate(filename, length, callback(err))

fs.ftruncate(fd, length, callback);// 对使用open打开的文件进行截断

删除空目录

fs.rmdir(path, callback(err))

监视文件或目录

1
2
3
4
5
6
7
fs.watchFile(file,[options],listener(curr, prev))
// options:{
persistent: true 当指定了监视文件后是否停止当前运行的程序
interval: int 每隔多少毫秒监视一次文件是否发生改变
}

curr 和 prev都是两个 fs.stats对象

fs.unwatchFile(filname, [listener]),当文件发生更改时取消某个处理函数,没有 listener 表示取消监听

fs.watch(file, [options],listener(event, file));event 为 rename(重命名,移动,删除)或 change(修改);watch 函数返回一个 fs.FSWatcher 对象,使用此对象的 close 方法关闭 watch 监视

文件流

js字符串

js 字符串方法预览:
fromCharCode(num1, num2,,,),
charAt(),
charCodeAt(),
length,
split(‘’),
slice(start, end?)
substring(start, end?)
trim()
concat()
toLowerCase()
toUpperCase()
indexOf(str, index?)
lastIndexOf(str, index?)
search(regexp)
match(regexp)
replace(search, replacement)

字符字面量与转义

单引号和双引号都可以表示字符字面量,’string is this’ “other string is that” 推荐在 js 中使用单引号,HTML 中使用双引号,转义字符以\开始, \n 换行符 \f 换页符号 \b 空格符 \r 回车符 \t 水平制表符号 \v 垂直制表符号

charCodeAt、charAt 与 fromCharCode

fromCharCode 返回由 utf-16 编码单元组成的字符串,而 charCodeAt 则返回指定位置的字符的 utf-16 码, charAt 返回制定位置的字符

1
2
3
String.fromCharCode(97, 98, 99); // 'abc'
"abc".charCodeAt(0); // 97
"abc".charAt(0); // 'a'

length

字符串的 length 属性为字符串的长度, ‘稻草人’.length // 3

split, slice, substring

split(code, limit)将字符串转换为数组以 code 字符分割,limit 为分隔后显示前几项

slice(start, end?)从字符串中截取子字符串,start 为开始位置,end 为结束位置(不包含)如果没有 end 参数则到字符串结尾

substring 和 slice 函数一样,参数值可以为负值

1
2
3
"test".split(""); //['t','e','s','t']
"test".split("", 2); //['t','e']
"test".slice(0, 2); //'te'

trim, concat

trim 去除字符串两侧的空格,concat 把对字符串进行拼接;

1
2
"  test   ".trim(); //'test'
"hello".concat(" name", " test"); // 'hello name test'

toLowerCase, toUpperCase

toLowerCase 把字符串转换为小写,toUpperCase 将字符串转换为大写字母

indexOf, lastIndexOf

indexOf(str, index?) str 为索引的字符,index 为开始的位置默认为 0;
lastIndexOf(str, index?) 和 indexOf 一样,只是从 index 位置开始向前开始查找

1
2
3
4
"test".indexOf("t"); // 0
"test".indexOf("t", 2); // 3
"test".lastIndexOf("t"); // 3
"test".lastIndexOf("t", 2); // 0

search, match, replace

search(regexp) 返回字符串中第一个与 regexp 相匹配的子字符串的起始位置,为匹配则返回-1;match(regexp) 将 regexp 与字符串匹配,若未设置 全局匹配标志则返回第一次匹配的相关信息,若设置了全局匹配标志则返回所有匹配的子字符串;replace(str or regexp, ‘replacestring’),将字符串中第一个 str 字符替换,或将匹配正则的字符替换,正则表达式中若设置全局标志则把所有匹配的字符全部替换,若未设置则只替换第一个匹配的字符,替换的目标字符中可以使用$符号进行完全匹配或捕获分组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
"-yy-xxx-y-".search(/x+/); // 4,不使用正则表达式时和indexOf函数一样
"-abb--aaab-".match(/(a+)b/); // [ 'ab', 'a', index: 1, input: '-abb--aaab-' ]
"-abb--aaab-".match(/(a+)b/g); //[ 'ab', 'aaab' ]

var str = "iixxxixx";
log(str.replace("i", "o")); // oixxxixx
log(str.replace(/i/, "o")); // oixxxixx
log(str.replace(/i/g, "o")); // ooxxxoxx
log(str.replace(/i+/g, "[$&]")); // [ii]xxx[i]xx
log(str.replace(/(i+)/g, "[$1]")); //[ii]xxx[i]xx

//replace 使用函数
var str = "axbbyyxaa";

function log() {
console.log.apply(null, arguments);
}

function repl(all) {
return all.toUpperCase();
}

log(str.replace(/a+|b+/g, repl)); //AxBByyxAA

js快速参考

概述:语法、变量与赋值、值、布尔值、数字、运算符、字符串、语句、函数、异常捕获、严格模式、变量作用域和闭包、对象和构造函数、数组、正则表达式、Math、标准其他库

语法

概述

var, let, const 用于声明变量(const 声明常量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var x; // 声明变量
x = 0; // 变量赋值
var arr = [1, 2, 3]; // 数组的声明与赋值

// 对象的声明与赋值
var obj = {
name: "bingxl",
foo: function (x, y) {},
};
foo(x, y); // 调用函数
obj.foo(x, y); // 调用对象的方法

if语句;
if (x === 0) {
// some statement
}

// 定义函数
function foo(x, y) {
// function statement
return 0;
}

语句与表达式

语句是做事情,一个语句用分号结束,语句块没有分号结束;表达式则是产生一个值

1
2
3
var str = ""; // 语句
str + "hello"; //表达式
func(x, y); //本身是个语句,但函数调用是表达式(产生了值)

分号

js 中分号可选,会自动判断语句结束位置并插入分号,但,,,,,,不推荐,最好一直带着分号

注释

单行注释: //
多行注释: /* */

变量和赋值

标识符:使用 unicode 字符、美元符、下划线开头后跟 unicode 字符、数字、美元符
保留字和 NAN、Infinity、undefined 不能用作变量名
使用 = 赋值, 复合赋值为 += 、 -= 、 /= 、 *=

分类: 布尔值、数字、字符串、undefined、 null、 对象
每一类值都有属性,每个属性都由 key 和 value 组成

原始值

原始值有布尔值、数字、字符串、undefined、null
特点:

  • 原始值按值进行比较,只要值相同就相等
1
2
3 === 3
'' === ''
  • 属性值不能改变、添加或移除

对象

属于对象的有:简单对象、数组、正则表达式

特点:

  • 按引用进行比较,比较身份标识符,每个值都有各自的身份标识符
  • 默认可变,对象的属性可以自由的被改变

undefined 和 null

undefined 表示没有值,而 null 表示没有对象,未赋值和缺失的参数都为 undefined

typeof 与 instanceof

typeof 操作结果:
操作数 | 结果
———-|———–
undefined | undefined
数字 | number
字符串 | string
布尔值 | boolean
函数 | function
null | object
数组 | object
对象 | object

instanceof:
value instanceof constr 如果 value 是通过 constr 构造器创建的对象则返回 true

布尔值

布尔值只有 true 和 false 两个值。
产生布尔值的运算符:

  • 二元逻辑运算符: && 、||
  • 前置逻辑运算符: !
  • 比较运算符: ===, !==, ==, !=, >, <, >=, <=

解释为 false 的值:

  • undefined、null
  • 布尔值 false
  • 数字: -0、0、NaN
  • 字符串: ‘’

其余都是 true 特别注意: [] 和 {} 都被解析为 true

二元逻辑运算符:

  • 二元逻辑运算符具有短路操作,能确定整个表达式的值后后面的运算数就不会执行
1
2
3
4
5
var i = 0;
true || i++;
i; //0;
false || i++;
i; //1
  • 二元运算符的返回值:如果第一个运算数能确定表达式的值则返回第一个运算数,否则返回第二个值
1
2
3
4
5
true && 1; //1
true && 0; //0
false && 1; //false
true || 0; // true
true || 1; // true

数字

js 中所有数字都是浮点数,也有三个特殊的值:NaN,Infinity,-Infinity;

运算符

运算操作: + - * / % ++ –

字符串

直接通过字面量来创建,通过方括号来方位字符串里的字符(只读),具有 length 属性。

字符串方法

slice、trim、toUpperCase, indexOf,

语句

条件语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (condition) {
// statement
}

if (condition) {
// statement
} else if (condition) {
// other statement
}

switch (condition) { // 通过 === 比较
case 'value':
// do something
break;
case '':
break;
...
default:
// default statement

}

循环语句

1
2
3
4
5
6
7
8
9
10
11
12
13
for ([<<init>>], [<<condition>>], [<<post_iteration>>]) {
// <<statement>>
}

while (condition) {
<<statement>>
}

do {
<<statement>>
} while (condition);


break 跳出循环,而 continue 结束本次循环,开始下一次循环

函数

函数声明:
function funName(parameter1, parameter2) {function body}
函数声明会提升,声明后的函数连同实体会被移动到其所在作用域的开始处; 通过 var 定义的变量也会发生提升,但只是定义发生了提升,赋值未提升。调用函数后返回一个值(函数表达式)。

###

异常捕获

严格模式

变量作用域和闭包

对象和构造函数

数组

正则表达式

Math

标准库的其他功能

Date

JSON

console 系列

axios

特点/功能

  • make XMLHttpRequests from browser 在浏览器环境里发送 AJAX 请求
  • make http requests from nodejs 在 nodejs 里发送 http 请求
  • supports the promise API 支持 promise(es6 语法)
  • intercept request and response 拦截请求和响应
  • transform request and response data 转换请求和响应数据
  • cancel requests 取消请求
  • automatic transforms for JSON data 自动转换 JSON 数据
  • client side support for protecting against xsrf 客户端支持防止 CSRF/XSRF

    Read More

H5概述

HTML5基本特征

向前兼容

H5向前兼容H4,H4可以直接在H5环境下运行,浏览器若不支持H5的新特新则会替换成相应的H4。
如表单输入类型若不支持新的type则转换为text类型。

跨平台运行

PC,手机,平板等支持H5的都可以无障碍运行H5运用,对H5游戏开发特别有利

简单易用

Read More

web页面实时刷新之browser-sync

web开发对实时刷新的需求

在刚开始学习前端时每次修改文件内容后都需要手工刷新下浏览器来看效果,做的次数多了就特别难受,有时仅仅修改了一个字母都需要刷新下页面查看

之后接触到编写边看的集成IDE,文件修改保存后就可以实时显示效果,用起来还不错,但有个问题就是IDE里面一般都是内嵌的一个浏览器,与常用的浏览器还是有许多区别的

Read More

在博客园使用百度统计

在博客园里使用百度统计

百度统计是什么?以下引用百度百科的解释
百度统计是百度推出的一款免费的专业网站流量分析工具,能够告诉用户访客是如何找到并浏览用户的网站,在网站上做了些什么,有了这些信息,可以帮助用户改善访客在用户的网站上的使用体验,不断提升网站的投资回报率。
百度统计提供了几十种图形化报告,全程跟踪访客的行为路径。同时,百度统计集成百度推广数据,帮助用户及时了解百度推广效果并优化推广方案。

Read More

网易前端工程师分享

第一场:前端成长之路

  1. 前端级别 // 来自网易公司的级别
    • 前端开发工程师
    • 高级前端开发工程师
    • 资深前端开发工程师
    • 前端技术专家
  2. 从 0 -> 前端开发工程师
    学习时学习的知识知识点,而开发时时要实现复杂业务需求,有时感到难以下手

    Read More