- r+ :打开文件用于读写
- w+ :打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
- a :打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
- a+ :打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
支持回调的api 回调api异步地执行所有操作,不会阻塞事件循环,然后在完成或错误时调用回调函数。回调api使用底层node.js线程池在事件循环线程之外执行文件系统操作。这些操作不是同步的也不是线程安全的。对同一文件执行多个并发修改时必须小心,否则会损害数据。
1. fs.access(path[,mode], callback)
测试用户对path指定的文件或目录的权限。mode参数是可选的整数,指定要执行的可访问性检查。查看文件访问的常量以获取可能的mode值。最后一个参数callback是回调函数,其使用一个可能的错误参数调用。如果任何可访问性检查失败,则错误参数将是Error对象。
import { open, close } from 'fs';
open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}
throw err;
}
try {
readMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
注: 在调用fs.open()、fs.readFile()或fs.writeFile()之前,不要使用fs.accesss()检查文件的可访问性。会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。而是,用户代码应直接打开/读取、写入文件,并处理无法访问文件时引发的错误。
2. fs.appendFile(path, data[,option],callback)
异步地将数据追加到文件,如果该文件尚不存在,则创建该文件。data可以为字符串或<buffer>。
import { appendFile } from 'fs';
appendFile('message.txt', 'data to append', (err) => {
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
import { appendFile } from 'fs';
appendFile('message.txt', 'data to append', 'utf8', callback);
可以将path指定为已打开用于追加(使用fs.open()或fs.openSync())的数字文件描述符。文件描述符不会自动关闭。
import { open, close, appendFile } from 'fs';
function closeFd(fd) {
close(fd, (err) => {
if (err) throw err;
});
}
open('message.txt', 'a', (err, fd) => {
if (err) throw err;
try {
appendFile(fd, 'data to append', 'utf8', (err) => {
closeFd(fd);
if (err) throw err;
});
} catch (err) {
closeFd(fd);
throw err;
}
});
3. fs.close(fd[, callback])
关闭文件描述符。除了可能的异常之外,没有为完成回调提供任何参数。通过任何其他fs操作对当前正在使用的任何文件描述符(fs)调用fs.close(),可能会导致为定义的行为。
4. fs.open(path[,flags[,mode]],callback)
异步地打开文件,回调有两个参数(err, fd)
5. fs.read(fd,buffer, offset, length, position, callback)
fd: 从fd指定的文件中读取数据。回调被赋予三个参数,(err, bytesRead, buffer)。
6. fs.read(fd,[options,] callback)
options是对象。
7. fs.readFile(path[,options],callback)
异步地读取文件的全部内容。回调传入了两个参数(err, data),其中data是文件的内容。如果为指定编码,则返回原始缓冲区。如果options是字符串,则它指定编码
import { readFile } from 'fs';
readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
import { readFile } from 'fs';
readFile('/etc/passwd', 'utf8', callback);
fs.readFile()函数缓冲整个文件。为了最小化内存成本,在可能的情况下优先通过fs.createReadStream()进行流式传输。
8. fs.createReadStream(path[, options])
与stream.Readable的16kb默认highWaterMark不同,此方法返回的流的默认highWaterMark为64kb。 options包括start和end值,以从文件中读取一定范围的字节,而不是整个文件。start和end都包含在内并且从0开始计数,允许的值在[0, Number.MAX_SAFE_INTEGER]范围内。如果指定了fd并且start被省略或undefined,则fs.createReadStream()从当前文件位置顺序读取。encoding可以是buffer接收的任何一种。 如果指定了fd,则ReadStream将忽略path参数并使用指定的文件描述符。默认情况下,流将在销毁后触发