Node.js 文件系统

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容