Node.js 文件系统

こ雲淡風輕ζ 提交于 2020-04-24 12:06:03

Node.js 中我们可以使用 fs(File System) 模块来操作文件,文件系统模块有两种不同的方法,分别是同步方法和异步方法。

同步和异步方法

Node.js 文件系统模块中的方法均有异步和同步版本,例如同步读取文件内容可以使用 fs.readFileSync() 方法,而异步读取文件内容可以使用 fs.readFile() 方法。

异步方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息。

在大型系统中,一般我们会使用异步方法,因为同步方法容易导致进程被锁死。所以比起同步方法,异步方法的性能更高、速度更快、而且没有阻塞。

示例:

假设有一个test.txt文件的内容如下所示:

学互联网工作技能,上侠课岛!
同步读取文件

我们使用同步方法来读取上面这个文件中的内容,创建一个名为 synchronization.js 的文件,文件中的内容如下,使用readFileSync()方法读取内容:

var fs = require("fs");
var data = fs.readFileSync('test.txt');
console.log("同步读取文件内容为:\n" + data.toString());
console.log("程序执行完毕");

启动这个 Node.js 文件,就会成功读取文件中的内容,如下所示:

>node synchronization.js
同步读取文件内容为:
学互联网工作技能,上侠课岛!
程序执行完毕
异步读取文件

使用异步方法读取 test.txt 文件中的内容,我们只需要将 readFileSync()方法替换成 readFile() 方法。 创建一个名为 asynchronous.js 的文件,文件中的内容如下所示,在使用 readFile() 方法时,注意第二个参数是一个回调函数,包含了错误信息:

var fs = require("fs")
fs.readFile('test.txt', function(err,data){
    if(err){
        return console.error(err);
    }
    console.log("异步读取文件内容为:\n"+data.toString());
});
console.log("程序执行完毕");

启动这个文件,会输出如下所示内容:

>node asynchronous.js
程序执行完毕
异步读取文件内容为:
学互联网工作技能,上侠课岛!

文件系统模块的使用

要使用文件系统模块 fs,首先需要使用require()方法引入模块,这个我们以前已经讲过好几次啦,语法如下所示:

var fs = require('fs');

引入模块后,我们可以通过这个模块,可以实现打开文件、读取文件、写入文件、关闭文件等操作。

打开文件操作

在异步模式下打开文件的语法如下所示:

fs.open(path, flags[, mode], callback)
  • path:文件路径。

  • flags:文件打开行为。

  • mode:文件模式。

  • callback:回调函数,带有两个参数:err和fd。

示例:
var fs = require("fs");
console.log("准备打开文件")
fs.open('test.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
});

启动这个文件,会成功输出如下内容:

> node openfile.js
准备打开文件
文件打开成功!

读取文件操作

异步模式下读取文件的语法为:

fs.read(fd, buffer, offset, length, position, callback)
  • fd:文件描述符。

  • buffer:数据写入的缓冲区。

  • offset:缓冲区写入的写入偏移量。

  • length:要从文件中读取的字节数。

  • position:文件读取的起始位置,如值为null,则会从当前文件指针的位置读取。

  • callback:回调函数,带有三个参数:err错误信息、bytesRead读取的字节数、buffer缓冲区对象。

示例:
var fs = require("fs");
var buf = new Buffer.alloc(1024);
console.log("准备打开文件");
fs.open('test.txt', 'r+', function(err, fd){
    if(err){
        return console.error(err);
    }
    console.log("文件打开成功!\n");

    console.log("开始读取文件!");
    fs.read(fd, buf, 0, buf.length, 0, function(err,bytes){
        if(err){
            console.log(err);
        }
        console.log("总共有读取了" + bytes + "个字节");

        if(bytes > 0){
            console.log("读取的内容为:" + "\n" + buf.slice(0, bytes).toString());
        }
    });
});

启动这个文件,输出如下内容,则表示读取文件操作成功:

>node readfile.js
准备打开文件
文件打开成功!

开始读取文件!
总共有读取了42个字节
读取的内容为:
学互联网工作技能,上侠课岛!

写入文件操作

异步模式下写入文件的语法为:

fs.writeFile(file, data[, options], callback)
  • file:文件名或文件描述符。

  • data:要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。

  • options:该参数是一个对象,包含 {encoding, mode, flag}。默认编码为utf8,模式为 0666,flag为'w'。

  • callback:回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

示例:
var fs = require("fs");
console.log("准备写入文件");
fs.writeFile('write.txt', '这里是要写入的数据内容',  function(err){
    if (err) {
        return console.error(err);
    }
    console.log("数据写入成功!");
});

启动文件,write.txt中成功被写内容:

> node writefile.js
准备写入文件
数据写入成功!

关闭文件操作

异步模式下关闭文件的语法为:

fs.close(fd, callback)
  • fd:通过fs.open()方法返回的文件描述符。

  • callback:回调函数,没有参数。

示例:
var fs = require("fs");
console.log("准备开文件")
fs.open('test.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!\n");     

  //关闭文件
  console.log("准备关闭文件");    
  fs.close(fd,function(err){
    if(err) {
        console.log(err);
    }
    console.log('文件关闭成功!');
  });
});

启动文件:

> node close.js
准备开文件
文件打开成功!

准备关闭文件
文件关闭成功!

文件模块方法参考手册

方法 描述
fs.rename(oldPath, newPath, callback) 异步 rename(),回调函数没有参数,但可能抛出异常
fs.ftruncate(fd, len, callback) 异步 ftruncate(),回调函数没有参数,但可能抛出异常
fs.ftruncateSync(fd, len) 同步 ftruncate()
fs.truncate(path, len, callback) 异步 truncate(),回调函数没有参数,但可能抛出异常
fs.truncateSync(path, len) 同步 truncate()
fs.chown(path, uid, gid, callback) 异步 chown(),回调函数没有参数,但可能抛出异常
fs.chownSync(path, uid, gid) 同步 chown()
fs.fchown(fd, uid, gid, callback) 异步 fchown(),回调函数没有参数,但可能抛出异常
fs.fchownSync(fd, uid, gid) 同步 fchown()
fs.lchown(path, uid, gid, callback) 异步 lchown(),回调函数没有参数,但可能抛出异常
fs.lchownSync(path, uid, gid) 同步 lchown()
fs.chmod(path, mode, callback) 异步 chmod(),回调函数没有参数,但可能抛出异常。
fs.chmodSync(path, mode) 同步 chmod()
fs.fchmod(fd, mode, callback) 异步 fchmod(),回调函数没有参数,但可能抛出异常
fs.fchmodSync(fd, mode) 同步 fchmod()
fs.lchmod(path, mode, callback) 异步 lchmod().回调函数没有参数,但可能抛出异常。Only available on Mac OS X
fs.lchmodSync(path, mode) 同步 lchmod()
fs.stat(path, callback) 异步 stat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象
fs.lstat(path, callback) 异步 lstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象
fs.fstat(fd, callback) 异步 fstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象
fs.statSync(path) 同步 stat(). 返回 fs.Stats 的实例
fs.lstatSync(path) 同步 lstat(). 返回 fs.Stats 的实例
fs.fstatSync(fd) 同步 fstat(). 返回 fs.Stats 的实例
fs.link(srcpath, dstpath, callback) 异步 link().回调函数没有参数,但可能抛出异常
fs.linkSync(srcpath, dstpath) 同步 link()
fs.symlink(srcpath, dstpath[, type], callback) 异步 symlink().回调函数没有参数,但可能抛出异常。 type 参数可以设置为 'dir', 'file', 或 'junction' (默认为 'file')
fs.symlinkSync(srcpath, dstpath[, type]) 同步 symlink().
fs.readlink(path, callback) 异步 readlink(). 回调函数有两个参数 err, linkString
fs.realpath(path[, cache], callback) 异步 realpath(). 回调函数有两个参数 err, resolvedPath
fs.realpathSync(path[, cache]) 同步 realpath()。返回绝对路径
fs.unlink(path, callback) 异步 unlink(),回调函数没有参数,但可能抛出异常
fs.unlinkSync(path) 同步 unlink().
fs.rmdir(path, callback) 异步 rmdir(),回调函数没有参数,但可能抛出异常
fs.rmdirSync(path) 同步 rmdir().
fs.mkdir(path[, mode], callback) S异步 mkdir(2),回调函数没有参数,但可能抛出异常。 访问权限默认为 0777
fs.mkdirSync(path[, mode]) 同步 mkdir().
fs.readdir(path, callback) 异步 readdir(3),读取目录的内容
fs.readdirSync(path) 同步 readdir(),文件数组列表
fs.close(fd, callback) 异步 close(),回调函数没有参数,但可能抛出异常
fs.closeSync(fd) 同步 close().
fs.open(path, flags[, mode], callback) 异步打开文件。
fs.openSync(path, flags[, mode]) 同步 version of fs.open().
fs.utimes(path, atime, mtime, callback)
fs.utimesSync(path, atime, mtime) 修改文件时间戳,文件通过指定的文件路径。
fs.futimes(fd, atime, mtime, callback)
fs.futimesSync(fd, atime, mtime) 修改文件时间戳,通过文件描述符指定。
fs.fsync(fd, callback) 异步 fsync.回调函数没有参数,但可能抛出异常。
fs.fsyncSync(fd) 同步 fsync.
fs.write(fd, buffer, offset, length[, position], callback) 将缓冲区内容写入到通过文件描述符指定的文件。
fs.write(fd, data[, position[, encoding]], callback) 通过文件描述符 fd 写入文件内容。
fs.writeSync(fd, buffer, offset, length[, position]) 同步版的 fs.write()。
fs.writeSync(fd, data[, position[, encoding]]) 同步版的 fs.write().
fs.read(fd, buffer, offset, length, position, callback) 通过文件描述符 fd 读取文件内容。
fs.readSync(fd, buffer, offset, length, position) 同步版的 fs.read.
fs.readFile(filename[, options], callback) 异步读取文件内容。
fs.readFileSync(filename[, options])
fs.writeFile(filename, data[, options], callback) 异步写入文件内容。
fs.writeFileSync(filename, data[, options]) 同步版的 fs.writeFile。
fs.appendFile(filename, data[, options], callback) 异步追加文件内容。
fs.appendFileSync(filename, data[, options]) The 同步 version of fs.appendFile.
fs.watchFile(filename[, options], listener) 查看文件的修改。
fs.unwatchFile(filename[, listener]) 停止查看 filename 的修改。
fs.watch(filename) 查看 filename 的修改,filename 可以是文件或目录。返回 fs.FSWatcher 对象。
fs.exists(path, callback) 检测给定的路径是否存在。
fs.existsSync(path) 同步版的 fs.exists.
fs.access(path[, mode], callback) 测试指定路径用户权限。
fs.accessSync(path[, mode]) 同步版的 fs.access。
fs.createReadStream(path[, options]) 返回ReadStream 对象。
fs.createWriteStream(path[, options]) 返回 WriteStream 对象。
fs.symlink(srcpath, dstpath[, type], callback) 异步 symlink().回调函数没有参数,但可能抛出异常。

更多可以查看:https://www.9xkd.com/3716132715.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!