在 Node.js 中使用文件描述符 open() openSync()
文件描述符:是使用fs模块提供的open()方法打开文件之后返回的。或者使用openSync()方法(该方法会返回文件描述符,而不是在回调中提供。)
const fs = require('fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fd 是文件描述符。
})
open方法的第二个参数控制读写:
- r+ 打开文件用于读写。
- w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
- a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
- a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
const fs = require('fs')
try {
const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
console.error(err)
}
Node.js 文件属性 stat() statSync()
调用时传入文件的路径,一旦Node.js获得文件的详细信息,则会调用传入的回调函数,并附带两个参数:错误消息和文件属性。
const fs = require('fs')
fs.stat('/Users/joe/test.txt', (err, stats) => {
if (err) {
console.error(err)
return
}
//可以访问 `stats` 中的文件属性
})
nodejs也提供了同步方法,statSync()会阻塞线程,直到文件属性准备就绪为止。
const fs = require('fs')
try {
const stats = fs.statSync('/Users/joe/test.txt')
} catch (err) {
console.error(err)
}
文件属性包括:
- 使用 stats.isFile() 和 stats.isDirectory() 判断文件是否目录或文件。
- 使用 stats.isSymbolicLink() 判断文件是否符号链接。
- 使用 stats.size 获取文件的大小(以字节为单位)。
Node.js 文件路径 path.dirname basename extname join resolve normalize
需要引入path模块: const path = require(‘path’)\
给定一个路径,可以用以下方法提取信息。
- dirname: 获取文件的父文件夹。
- basename: 获取文件名部分。
- extname: 获取文件的扩展名。
// 可以通过为 basename 指定第二个参数来获取不带扩展名的文件名
path.basename(notes, path.extname(notes)) //notes
使用路径
- join() 连接路径的两个或多个片段
- resolve() 获得相对路径的绝对路径计算
- normalize() 当包含诸如 .、… 或双斜杠之类的相对说明符时,其会尝试计算实际的路径
// 如果指定第二个文件夹参数,则 resolve 会使用第一个作为第二个的基础
path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' 如果从主文件夹运行。
// 如果第一个参数以斜杠开头,则表示它是绝对路径:
path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'
path.normalize('/users/joe/..//test.txt') //'/users/test.txt'
解析和规范化都不会检查路径是否存在。 其只是根据获得的信息来计算路径。
使用 Node.js 读取文件 readFile() readFileSync()
向其传入文件路径、编码、以及会带上文件数据(以及错误)进行调用的回调函数
const fs = require('fs')
fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
console.log(data)
})
const fs = require('fs')
try {
const data = fs.readFileSync('/Users/joe/test.txt', 'utf8')
console.log(data)
} catch (err) {
console.error(err)
}
fs.readFile() 和 fs.readFileSync() 都会在返回数据之前将文件的全部内容读取到内存中。
这意味着大文件会对内存的消耗和程序执行的速度产生重大的影响。
在这种情况下,更好的选择是使用流来读取文件的内容。
使用 Node.js 写入文件 writeFile() writeFileSync() appendFile() appendFileSync()
const fs = require('fs')
const content = '一些内容'
fs.writeFile('/Users/joe/test.txt', content, err => {
if (err) {
console.error(err)
return
}
//文件写入成功。
})
const fs = require('fs')
const content = '一些内容'
try {
const data = fs.writeFileSync('/Users/joe/test.txt', content) // 默认情况下content会替换此文件的内容,也可以传入第三个参数来指定其他操作
//文件写入成功。
} catch (err) {
console.error(err)
}
默认情况下content会替换此文件的内容,也可以传入第三个参数来指定其他操作。第三个参数指定标志:
- r+ 打开文件用于读写。
- w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
- a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
- a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
举个例子:
fs.writeFile('/Users/joe/test.txt', content, { flag: 'a+' }, err => {})
将内容追加到文件末尾的便捷方法:
const content = '一些内容'
fs.appendFile('file.log', content, err => {
if (err) {
console.error(err)
return
}
//完成!
})
所有这些方法都是在将全部内容写入文件之后才会将控制权返回给程序(在异步的版本中,这意味着执行回调)。
在这种情况下,更好的选择是使用流写入文件的内容。
在 Node.js 中使用文件夹 access() mkdir() mkdirSync() readdir() readdirSync() rename() renameSync() rmdir() rmdirSync() remov()
- access() 检查文件夹是否存在以及 Node.js 是否具有访问权限。
- mkdir() 创建新的文件夹
- readdir() 读取目录的内容
- rename() 重命名文件夹
- rmdir() 删除文件夹
- remove() 删除包含内容的文件夹可能会更复杂,所以需要用到它,还得安装,他是fs的替代品,npm install fs-extra。
不赘述了。