一、获取文件描述符
在与位于文件系统中的文件进行交互之前,需要先获取文件的描述符。
文件描述符是使用 fs 模块提供的 open() 方法打开文件后返回的:
const fs = require('fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
//fd 是文件描述符。
console.log(fd)
})
也可以使用 fs.openSync 方法打开文件,该方法会返回文件描述符
const fs = require('fs')
try {
const fd = fs.openSync('/Users/joe/test.txt', 'r')
console.log(fd)
} catch (err) {
console.error(err)
}
其他常用的标志有:
r+
打开文件用于读写。
w+
打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
a
打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
a+
打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
二、文件属性
使用 fs 模块提供的 stat() 方法。调用时传入文件的路径,一旦 Node.js 获得文件的详细信息,则会调用传入的回调函数,并带上两个参数:错误消息和文件属性 :
const fs = require('fs')
fs.stat('test.txt', (err, stats) => {
if (err) {
console.error(err)
return
}
//可以访问 `stats` 中的文件属性
})
同步方法:
const fs = require('fs')
try {
const stats = fs.statSync('test.txt')
} catch (err) {
console.error(err)
}
文件的信息包含在属性变量中,常用的有:
1、使用 stats.isFile() 和 stats.isDirectory() 判断文件是否目录或文件。
2、使用 stats.isSymbolicLink() 判断文件是否符号链接。
3、使用 stats.size 获取文件的大小(以字节为单位)。
三、文件路径
不同系统的文件路径可能存在一定的差异,因此必须考虑到这种差异。我们可以引入和使用 path 模块:
const path = require('path')
1、路径信息
给定一个路径,可以使用以下方法从其中提取信息:
dirname: 获取文件的父文件夹。
basename: 获取文件名部分。
extname: 获取文件的扩展名。
const notes = '/users/joe/notes.txt'
path.dirname(notes) // /users/joe
path.basename(notes) // notes.txt
path.extname(notes) // .txt
可以通过为 basename 指定第二个参数来获取不带扩展名的文件名:
path.basename(notes, path.extname(notes)) //notes
2、使用路径
可以使用 path.join() 连接路径的两个或多个片段:
const name = 'joe'
path.join('/', 'users', name, 'notes.txt') //'/users/joe/notes.txt'
可以使用 path.resolve() 获得相对路径的绝对路径计算:
path.resolve('joe.txt') //'/Users/joe/joe.txt' 如果从主文件夹运行。
在此示例中,Node.js 只是简单地将 /joe.txt 附加到当前工作目录。 如果指定第二个文件夹参数,则 resolve 会使用第一个作为第二个的基础:
path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' 如果从主文件夹运行。
如果第一个参数以斜杠开头,则表示它是绝对路径:
path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'
path.normalize() 是另一个有用的函数,当包含诸如 .、… 或双斜杠之类的相对说明符时,其会尝试计算实际的路径:
path.normalize('/users/joe/..//test.txt') //'/users/test.txt'
四、读取文件
在 Node.js 中读取文件最简单的方式是使用 fs.readFile() 方法,向其传入文件路径、编码、以及会带上文件数据(以及错误)进行调用的回调函数:
const fs = require('fs')
fs.readFile('test.txt', 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
console.log(data)
})
同步方法:
const fs = require('fs')
try {
const data = fs.readFileSync('test.txt', 'utf8')
console.log(data)
} catch (err) {
console.error(err)
}
五、写入文件
在 Node.js 中写入文件最简单的方式是使用 fs.writeFile() API。
const fs = require('fs')
const content = '一些内容'
fs.writeFile('test.txt', content, err => {
if (err) {
console.error(err)
return
}
//文件写入成功。
})
同步方法 fs.writeFileSync():
const fs = require('fs')
const content = '一些内容'
try {
const data = fs.writeFileSync('test.txt', content)
//文件写入成功。
} catch (err) {
console.error(err)
}
默认情况下,此 API 会替换文件的内容(如果文件已经存在)。
可以通过指定标志来修改默认的行为:
fs.writeFile('test.txt', content, {
flag: 'a+' }, err => {
})
可能会使用的标志有:
(1)r+
打开文件用于读写。
(2)w+
打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
(3)a
打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
(4)a+
打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
六、追加到文件
将内容追加到文件末尾的便捷方法是 fs.appendFile()
const content = '一些内容'
fs.appendFile('file.log', content, err => {
if (err) {
console.error(err)
return
}
//完成!
})
七、文件夹操作
1、检查文件夹是否存在
使用 fs.access() 检查文件夹是否存在以及 Node.js 是否具有访问权限。
2、创建新的文件夹
使用 fs.mkdir() 或 fs.mkdirSync() 可以创建新的文件夹。
const fs = require('fs')
const folderName = './test'
try {
if (!fs.existsSync(folderName)) {
fs.mkdirSync(folderName)
}
} catch (err) {
console.error(err)
}
3、读取目录的内容
使用 fs.readdir() 或 fs.readdirSync() 可以读取目录的内容。
这段代码会读取文件夹的内容(全部的文件和子文件夹),并返回它们的相对路径:
const fs = require('fs')
const path = require('path')
const folderPath = './newDir'
console.log(fs.readdirSync(folderPath))
4、重命名文件夹
使用 fs.rename() 或 fs.renameSync() 可以重命名文件夹。 第一个参数是当前的路径,第二个参数是新的路径:
fs.rename('./test', './rename', err => {
if (err) {
console.error(err)
return
}
})
同步方法 fs.renameSync():
const fs = require('fs')
try {
fs.renameSync('./test', './rename')
} catch (err) {
console.error(err)
}
5、删除文件夹
使用 fs.rmdir() 或 fs.rmdirSync() 可以删除文件夹。
fs.rmdir('./rename',function(){
console.log('删除成功');
})
删除包含内容的文件夹可能会更复杂。
在这种情况下,最好安装 fs-extra 模块,该模块非常受欢迎且维护良好。 它是 fs 模块的直接替代品,在其之上提供了更多的功能。
安装:
npm install fs-extra
使用:
const fs = require('fs-extra')
const folder = './rename'
fs.remove(folder, err => {
console.error(err)
})
八、文件系统模块 fs
fs 模块提供了许多非常实用的函数来访问文件系统并与文件系统进行交互。无需安装。 作为 Node.js 核心的组成部分,可以通过简单地引用来使用它:
const fs = require('fs')
fs模块方法:
fs.access(): 检查文件是否存在,以及 Node.js 是否有权限访问。
fs.appendFile(): 追加数据到文件。如果文件不存在,则创建文件。
fs.chmod(): 更改文件(通过传入的文件名指定)的权限。相关方法:fs.lchmod()、fs.fchmod()。
fs.chown(): 更改文件(通过传入的文件名指定)的所有者和群组。相关方法:fs.fchown()、fs.lchown()。
fs.close(): 关闭文件描述符。
fs.copyFile(): 拷贝文件。
fs.createReadStream(): 创建可读的文件流。
fs.createWriteStream(): 创建可写的文件流。
fs.link(): 新建指向文件的硬链接。
fs.mkdir(): 新建文件夹。
fs.mkdtemp(): 创建临时目录。
fs.open(): 设置文件模式。
fs.readdir(): 读取目录的内容。
fs.readFile(): 读取文件的内容。相关方法:fs.read()。
fs.readlink(): 读取符号链接的值。
fs.realpath(): 将相对的文件路径指针(.、…)解析为完整的路径。
fs.rename(): 重命名文件或文件夹。
fs.rmdir(): 删除文件夹。
fs.stat(): 返回文件(通过传入的文件名指定)的状态。相关方法:fs.fstat()、fs.lstat()。
fs.symlink(): 新建文件的符号链接。
fs.truncate(): 将传递的文件名标识的文件截断为指定的长度。相关方法:fs.ftruncate()。
fs.unlink(): 删除文件或符号链接。
fs.unwatchFile(): 停止监视文件上的更改。
fs.utimes(): 更改文件(通过传入的文件名指定)的时间戳。相关方法:fs.futimes()。
fs.watchFile(): 开始监视文件上的更改。相关方法:fs.watch()。
fs.writeFile(): 将数据写入文件。相关方法:fs.write()。
fs 模块的方法默认情况下都是异步的,但是在后面加上 Sync 即可以调用同步方法。
例如:
fs.write() =》 fs.writeSync()