zoukankan      html  css  js  c++  java
  • Node 的 模块 及fs 模块的使用

    Node模块的分类

    浏览器(客户端)中的JS

    Node中的JS

    在浏览器运行的js 有BOM和DOM 及网络控制等对象,Node也有各种各样的模块,但大致可分为三类:

    1、核心模块

    2、文件模块

    3、第三方模块(npm安装的)

    Node 核心模块

    核心模块有哪些?

    可以参考http://nodejs.cn/api/,在手册中出现的模块都是核心模块

    核心模块-fs模块

    文档

    http://nodejs.cn/api/fs.html

    fs模块用于对系统文件及目录进行读写操作。

    一、同步和异步

    使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。

    异步方法中回调函数的第一个参数总是留给异常参数(exception),如果方法成功完成,该参数为null或undefined。

    异步写法demo:有一个回调函数。

    var fs = require('fs'); // 载入fs模块
    
    fs.unlink('/tmp/shiyanlou', function(err) {
        if (err) {
            throw err;
        }
        console.log('成功删除了 /tmp/shiyanlou');
    });
    

    同步写法demo:

    var fs = require('fs');
    
    fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
    console.log('成功删除了 /tmp/shiyanlou');
    

    同步方法执行完并返回结果后,才能执行后续的代码。而异步方法采用回调函数接收返回结果,可以立即执行后续代码。

    二、readFile读取文件

    fs.readFile (path[, options], callback) 读取文件

    readFile 参数说明

    • path | | | 文件名或文件描述符。
    • options |
      • encoding | 默认值: null。
      • flag 参见文件系统 flag 的支持。默认值: 'r'。
    • callback
      • err 错误的返回
      • data | 读取的数据

    异步读取文件Demo

    var fs = require('fs');
    
    fs.readFile('./text.txt', 'utf-8', function (err, data) {
        console.log(err);
        console.log(data);
    });
    

    运行结果

    image-20201002180929963

    同步读取文件Demo

    readFile同步的写法就是没有回调函数:fs.readFileSync(filename,[options])。

    var fs = require('fs');
    
    var data = fs.readFileSync('./text.txt', 'utf-8',);
    console.log(data);
    

    运行结果

    image-20201002181430083

    三、WriteFile写入文件

    使用fs.writeFile(filename,data,[options],callback)写入内容到文件。

    • file | | | 文件名或文件描述符。
    • data | | | 要写入的数据
    • options |
      • encoding | 默认值: 'utf8'。
      • mode 默认值: 0o666。
      • flag 参见文件系统 flag 的支持。 默认值: 'w'。
    • callback
      • err

    异步写入demo

    var fs = require('fs'); // 引入fs模块
    
    // 写入文件内容(如果文件不存在会创建一个文件)
    // 写入时会先清空文件
    fs.writeFile('./test2.txt', 'test test', function(err) {
        if (err) {
            throw err;
        }
    
        console.log('Saved.');
    
        // 写入成功后读取测试
        fs.readFile('./test2.txt', 'utf-8', function(err, data) {
            if (err) {
                throw err;
            }
            console.log(data);
        });
    });
    

    运行结果

    image-20201002182102965

    因为默认flag='w'是写,会清空文件,想要追加,可以传递一个flag参数,如下。

    var fs = require('fs'); // 引入fs模块
    
    // 写入文件内容(如果文件不存在会创建一个文件)
    // 传递了追加参数 { 'flag': 'a' }
    fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
        if (err) {
            throw err;
        }
    
        console.log('Saved.');
    
        // 写入成功后读取测试
        fs.readFile('./test2.txt', 'utf-8', function(err, data) {
            if (err) {
                throw err;
            }
            console.log(data);
        });
    });
    

    flag传值,r代表读取文件,w代表写文件,a代表追加。

    image-20201002182300149

    同步写入Demo

    var fs = require('fs'); // 引入fs模块
    
    var res = fs.writeFileSync('./test3.txt', 'test test', { 'flag': 'a' });
    console.log(res);
    
    var data = fs.readFileSync('./test3.txt', 'utf-8',);
    console.log(data);
    

    运行结果

    image-20201002183933236

    四、使用fs.read和fs.write读写文件

    fs.read和fs.write功能类似fs.readFile和fs.writeFile(),但提供更底层的操作,实际应用中多用fs.readFile和fs.writeFile。

    使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。

    1、fs.read()

    fs.open。

    fs.open(path,flags,[mode],callback)方法用于打开文件,以便fs.read()读取。

    参数说明:

    • path 文件路径
    • flags打开文件的方式
    • [mode] 是文件的权限(可行参数,默认值是0666)
    • callback 回调函数

    flags值及说明如下

    r :读取文件,文件不存在时报错;
    r+ :读取并写入文件,文件不存在时报错;
    rs :以同步方式读取文件,文件不存在时报错;
    rs+ :以同步方式读取并写入文件,文件不存在时报错;
    w :写入文件,文件不存在则创建,存在则清空;
    wx :和w一样,但是文件存在时会报错;
    w+ :读取并写入文件,文件不存在则创建,存在则清空;
    wx+ :和w+一样,但是文件存在时会报错;
    a :以追加方式写入文件,文件不存在则创建;
    ax :和a一样,但是文件存在时会报错;
    a+ :读取并追加写入文件,文件不存在则创建;
    ax+ :和a+一样,但是文件存在时会报错。
    
    fs.close(fd,[callback])

    用于关闭文件,fd是所打开文件的文件描述符。

    fs.read(fd,buffer,offset,length,position,callback)接收6个参数。

    参数说明:

    • fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
    • buffer 是存放读取到的数据的Buffer对象。
    • offset 指定 向buffer中存放数据的起始位置
    • length 指定 读取文件中数据的字节数
    • position 指定 在文件中读取文件内容的起始位置
    • callback 回调函数,参数如下
      • err 用于抛出异常
      • bytesRead 从文件中读取内容的实际字节数
      • buffer 被读取的缓存区对象。

    demo: read.js内容如下

    var fs = require('fs'); // 引入fs模块
    
    // 打开文件
    fs.open('./testread.txt', 'r', function(err, fd) {
        if (err) {
            throw err;
        }
        console.log('open file success.');
        var buffer = new Buffer(255);
        // 读取文件
        fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
            if (err) {
                throw err;
            }
            // 打印出buffer中存入的数据
            console.log(bytesRead, buffer.slice(0, bytesRead).toString());
    
            // 关闭文件
            fs.close(fd);
        });
    });
    

    2、fs.write()

    fs.read(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6个参数。

    参数说明:

    • fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
    • buffer 是存放 将被写入的数据,buffer尺寸的大小设置最好是8的倍数,效率较高。
    • offset buffer写入的偏移量
    • length (integer)指定 写入文件中数据的字节数
    • position (integer) 指定 在写入文件内容的起始位置
    • callback 回调函数,参数如下
      • err 用于抛出异常
      • bytesWritten从文件中读取内容的实际字节数
      • buffer 被读取的缓存区对象。
    var fs = require('fs'); // 引入fs模块
    
    // 打开文件
    fs.open('./testwrite.txt', `w`, function(err, fd) {
        if (err) {
            throw err;
        }
        console.log('open file success.');
        var buffer = new Buffer('shiyanlou');
        // 读取文件
        fs.write(fd, buffer, 0, 6, 0, function(err, bytesWritten, buffer) {
            if (err) {
                throw err;
            }
    
            console.log('write success.');
            // 打印出buffer中存入的数据
            console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());
    
            // 关闭文件
            fs.close(fd);
        });
    });
    

    五、目录操作

    1、创建目录

    使用fs.mkdir(path,[mode],callback)创建目录,path是需要创建的目录,[mode]是目录的权限(默认是0777),callback是回调函数。

    demo:mkdir.js内容如下

    var fs = require('fs'); // 引入fs模块
    
    // 创建 newdir 目录
    fs.mkdir('./newdir', function(err) {
        if (err) {
            throw err;
        }
        console.log('make dir success.');
    });
    

    删除目录可以用fs.rmdir(path,callback);但是只能删除空目录。

    2、读取目录

    使用fs.readdir(path,callback)读取文件目录。

    demo:readdir.js内容如下

    var fs = require('fs'); // 引入fs模块
    
    fs.readdir('./newdir', function(err, files) {
        if (err) {
            throw err;
        }
        // files是一个数组
        // 每个元素是此目录下的文件或文件夹的名称
        console.log(files);
    });
    

    六、读取文件详细信息

    fs.stat 同步

    同步方法查看文件信息fs.statSync(path);

    const fs = require('fs');
    let mkdir = './mkdir';
    
    fs.stat(mkdir, (err, stats) => {
      if (err) {
        console.log(`fs.stats ${mkdir} file failed~`);
      } else {
        console.log(`fs.stats ${mkdir} file success~`);
        console.log(stats);
      }
    });
    

    stats详解

    Stats {
     dev: 2050,文件或目录所在的设备ID,仅在UNIX有效
     mode: 16877,使用数值形式代表的文件或目录的权限标志
     nlink: 3,文件或目录的硬连接数量
     uid: 0,文件或目录的所有者的用户ID,仅在UNIX有效
     gid: 0,文件或目录的所有者的用户组ID,仅在UNIX有效
     rdev: 0,为字符设备文件或块设备文件所在设备ID,仅在UNIX有效
     blksize: 4096,
     ino: 4197533,文件或目录的索引编号,仅在UNIX有效
     size: 4096,文件尺寸,即文件中的字节数
     blocks: 8,
     atimeMs: 1511846425357.986,
     mtimeMs: 1511846425256.986,
     ctimeMs: 1511846425256.986,
     birthtimeMs: 1511846425256.986,
     atime: 2017-11-28T05:20:25.358Z,文件的访问时间
     mtime: 2017-11-28T05:20:25.257Z,文件的修改时间
     ctime: 2017-11-28T05:20:25.257Z,文件的创建时间
     birthtime: 2017-11-28T05:20:25.257Z 
    }
    

    fstat方法查询文件信息

    使用open方法或openSync方法打开文件并返回文件描述符时,可以使用fs模块中的fstat方法查询被打开的文件信息

    const fs = require('fs');
    let mkdir = './mkdir';
    
    fs.open(mkdir, 'r', (err, fd) => {
      if (err) {
        console.log(`open ${mkdir} file failed~`);
        return false;
      }
      fs.fstat(fd, (err, stats) => {
        if (err) {
          console.log(`fstat ${mkdir} file failed~`);
          return false;
        }
        console.log(JSON.stringify(stats));
      })
    })
    

    fs.fstat结果

    {
      "dev": 1041887651,
      "mode": 16822,
      "nlink": 1,
      "uid": 0,
      "gid": 0,
      "rdev": 0,
      "ino": 4222124650663107,
      "size": 0,
      "atimeMs": 1519394418412.3062,
      "mtimeMs": 1519394418412.3062,
      "ctimeMs": 1519394418412.3062,
      "birthtimeMs": 1519394418402.2554,
      "atime": "2018-02-23T14:00:18.412Z",
      "mtime": "2018-02-23T14:00:18.412Z",
      "ctime": "2018-02-23T14:00:18.412Z",
      "birthtime": "2018-02-23T14:00:18.402Z"
    }
    
  • 相关阅读:
    产品经理的创新思维
    大型互联网网站架构心得之二:并、换和其它(转)
    访问IIS元数据库失败解决方法(转)
    (转)SQL Server 假执行,预执行
    从LiveJournal后台发展看 大型网站系统架构以及性能优化方法(转)
    浏览器并发连接数
    转:Session服务器配置指南与使用经验
    转:安装IIS无法找到zClientm.exe文件的解决办法
    使用开源软件,设计高性能可扩展互动网站
    大型互联网网站架构心得之一:分(转)
  • 原文地址:https://www.cnblogs.com/makalochen/p/13762430.html
Copyright © 2011-2022 走看看