6.1 同步方法(xxxSync)与异步方法


6.2 对文件执行读写操作
6.2.1 文件的完整读写
完整读取文件,如上例子。
fs.readFile(filename, [options], callback)
options为一个对象,
(1)该对象的flag属性可指定对文件采取什么操作,默认为'r'
'r': 读取文件,如果文件不存中则抛出异常
'r+': 读取并写入文件,如果文件不存中则抛出异常
....
(2)encoding属性用于指定使用何种编码格式来读取文件,若不指定encoding属性时,该参数值为一个存放了文件中原始二进制内容的缓存对象。

要完整写入文件,可以使用fs模块中的writeFile / writeFileSync 方法
fs.writeFile(filename,data,[options],callback)
options对象:
- flag属性: 用于指定对该文件采取何种操作,默认 为'w'(文件不存在时创建该文件,文件已存在时重写该文件)
- mode属性: 用于指定当文件被打开时对该文件的读写权限
- encoding属性
var fs = require('fs');
fs.writeFile('./chapter-6/message.txt','这是第一行。\r\n这是第二行。', function(err){
if (err) {
console.log('写入文件操作失败')
} else {
console.log('写入文件操作成功')
}
})
var fs = require('fs');
var data = new Buffer('我喜爱编程')
fs.writeFile('./chapter-6/message.txt',data, function(err){
if (err) {
console.log('写入文件操作失败')
} else {
console.log('写入文件操作成功')
}
})
// 追加数据
var fs = require('fs');
var options = {
flag: 'a'
}
fs.writeFile('./chapter-6/message.txt','这是追加的数据',options, function(err){
if (err) {
console.log('写入文件操作失败')
} else {
console.log('写入文件操作成功')
}
})
实现图片的复制:
读取写入文件时使用base64编码

writeFileSync:
fs.writeFileSync(filename,data,[options])
appendFile/appendFileSync
用于将数据追加到文件底部(跟writeFile一样的结果呀?!)
fs.appendFile(filename,data,[options],callback)
fs.appendFileSync(filename,data,[options])

6.2.2 从指定位置处开始读写文件
-
使用open方法打开应用程序根目录下的message.txt文件,并在回调函数中将fd参数值输出到控制台窗口中
image.png
-
打开文件之后,可以在回调函数中使用fs模块中的read方法或readSync方法从文件的指定位置处读取文件,也可以使用fs模块中的write方法或writeSync方法从文件的指定处开始写入数据
- 读取数据:
fs.read(fd,buffer,offset,length,position,callback)
// buffer: 用于指定将文件数据读取到哪个缓存区中
// offset: 缓存区中写入数据时的开始写入位置(以字节为单位)
// length: 用于指定从文件中读取的字节数
// position: 指定读取文件时的开始位置(以字节为单位),如果该参数为null,将从文件的当前被读取位置处(前一次读取时的开始位置+读取字节数)开始读取文件
var bytesRead = fs.readSync(fd,buffer,offset,length,position)


- 写入数据:
fs.write(fd,buffer,offset,length,position,callback)
// offset: 指定从缓存区中读取数据时的开始读取位置(以字节为单位)
// length: 指定从缓存区中读取的字节数
// position: 指定写入文件时的开始位置(以字节为单位)
fs.writeSync(fd,buffer,offset,length,position)

- 在fs模块中,提供close方法与closeSync方法以关闭文件
fs.close(fd,[callback])
为了防止数据丢失,在调用close方法之前先调用fsync方法以将内存缓冲区中的数据全部书写到文件中
fs.sync(fd, [callback])
6.3 创建与读取目录
- 创建目录
fs.mkdir(path, [mode], callback)
// mode : 指定该目录的权限,默认值为0777(表示任何人可读写该目录)
fs.mkdirSync(path, [mode])

- 读取目录
fs.readdir(path, callback)
var files = fs.readdirSync(path)

6.4 查看与修改文件或目录的信息
6.4.1 查看文件或目录的信息
fs.stat(path, callback)
fs.lstat(path, callback) // 当查看符号链接文件的信息时,必须使用这个方法
var fs = require('fs')
fs.stat('./chapter-6/message.txt', function(err, stats){
console.log(stats)
})
stats 是fs.Stats对象,该对象拥有如下的属性和方法
-
isFile方法
-
isDirectory方法
-
isBlockDevice方法
-
isSocket方法
-
dev 属性
-size 属性
....
image.png
-
使用同步方式查看文件时:
var stats = fs.statSync(path)
var stats = fs.lstatSync(path)
- 在使用open/openSync方法打开文件并返回文件描述符后,可以使用fs模块中的fstat方法查询被打开的文件信息
fs.fstat(fd, callback)
var stats = fs.fstatSync(fd)
6.4.2 检查文件或目录是否存在
fs.exists(path, callback)
var exists = fs.existsSync(path)
var fs = require('fs')
fs.exists('./msssss.txt', function(exists) {
if (exists) {
console.log('该文件存在')
} else {
console.log('该文件不存在')
}
})
6.4.3 获取文件或目录的绝对路径
fs.realpath(path, [cache], callback)
- cache为可选参数,cache为一个对象,其中存放了一些预先指定的路径。
var fs = require('fs')
var cache = {'/etc': '/private/etc'} // path 中的 /etc 指的就是 /private/etc
fs.realpath('/etc/passwd', cache, function(err, resolvedPath) {
if (err) {
console.log('获取目录的绝对路径失败', err)
} else {
console.log('resolvedPath', resolvedPath)
}
})
var fs = require('fs')
fs.realpath('./chapter-6/message.txt', function(err, resolvedPath) {
if (err) {
console.log('获取目录的绝对路径失败', err)
} else {
console.log('resolvedPath', resolvedPath)
}
})
PS E:\study\NodeJS-Learning> node chapter-6.js
resolvedPath E:\study\NodeJS-Learning\chapter-6\message.txt
同步:
var resolvedPath = fs.realpathSync(path, [cache])
6.4.3 修改文件访问时间及修改时间
fs.utimes(path, atime, mtime, callback)
6.4.4 修改文件或目录的读写权限
fs.chmod(path, mode, callback)
6.5 对文件或目录执行的其他操作
6.5.1 移动文件或目录
fs.rename(oldPath, newPath, callback)
- 当移动后的路径与原路径为同一路径,而移动后的文件名(目录名)与原文件名(目录名)不同时,则执行文件或目录的重命名操作
var fs = require('fs')
var files = fs.rename('./chapter-6/message.txt', './test/text.txt', function(err) {
// test 子目录必须已经存在,否则将导致移动操作失败
if (err) {
console.log('移动文件操作失败', err)
} else {
console.log('移动文件操作成功')
}
})
fs.renameSync(oldPath, newPath)
6.5.2 创建与删除文件的硬链接
- 创建硬链接(改变一个文件,在另外一个路径的文件也会被改变)
fs.link(srcpath, dstpath, callback)
fs.linkSync(srcpath, dstpath)
var fs = require('fs')
fs.link('./chapter-6/hardlink-text.txt', './test/hardlink-dst.txt', function(err) {
if (err) {
console.log('创建硬链接失败')
} else {
console.log('创建硬链接操作成功')
}
})
删除硬链接(在创建多个硬链接后,再删除其中任何一个硬链接,其他硬链接依然存在,但若删除的硬链接为该文件的最后一个硬链接,则事实上就是彻底删除该文件了)
fs.unlink(path, callback)
fs.unlinkSync(path)
var fs = require('fs')
fs.unlink('./chapter-6/hardlink-text.txt', function(err) {
if (err) {
console.log('删除硬链接失败')
} else {
console.log('删除硬链接操作成功')
}
})
6.5.3 创建与查看符号链接
- 符号链接: (类似与桌面快捷键)
fs.symlink(srcpath, dstpath, [type], callback)
fs.symlinkSync(srcpath, dstpath, [type])
- type : 指定为 文件创建符号链接(file) 还是 目录创建符号链接(dir)
var fs = require('fs')
fs.symlink('./chapter-6', './symlink', 'dir', function(err) {
if (err) {
console.log('为目录创建符号链接操作失败', err)
} else {
console.log('为目录创建符号链接操作成功')
}
})
var fs = require('fs')
fs.symlink(__dirname + '/chapter-6/symlink-src.txt', __dirname + '/symlink-dst.txt', 'file', function(err) {
if (err) {
console.log('为文件创建符号链接操作失败', err)
} else {
console.log('为文件创建符号链接操作成功')
}
})
当直接在终端运行时候,会报错,创建符号链接失败
[Error: EPERM: operation not permitted, symlink '.\chapter-6' -> 'E:\study\NodeJS-Learning\symlink']
解决办法,以管理员的身份运行git,然后就成功了
- 查看符号中所包含的另外一个文件(目录)的路径 以及 文件名(目录名)
fs.readlink(path, function(err, linkString) {
} )
var linkString = fs.readlinkSync(path)
var fs = require('fs')
fs.symlink(__dirname + '/chapter-6/symlink-src', __dirname + '/symlink-dst.txt', function(err, linkString){
if (err) {
console.log('为文件创建符号链接操作失败', err)
} else {
fs.readlink(__dirname + '/symlink-dst.txt', function(err, linkString) {
if (err) {
console.log('读取符号链接操作失败', err)
} else {
console.log('linkString: ' + linkString)
}
})
}
})
E:\study\NodeJS-Learning>node chapter-6.js
linkString: E:\study\NodeJS-Learning\chapter-6\symlink-src
网友评论