node.js fs模块(文件系统)

770 阅读4分钟

node.js fs模块(文件系统)

一、fs 的简介

fs(filesystem) 是 node.js 提供对服务器文件进行操作的模块,基本上是 POSIX 文件操作命令的简单包装。fs 模块中几乎对所有操作都提供异步和同步 (后缀 Sync) 两种操作方式。异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息 (error),相较于同步的方法,前者性能更高,速度更快,而且没有阻塞,所以一般都优先使用异步的方法。下文中举例中均使用异步方法。

二、fs 的使用

引入

使用 fs 对进行文件操作前需要先引入该模块

const fs = require('fs');

常见操作

1. fs.stat()

stat 方法用于判断正在操作的是文件还是目录。

const fs = require('fs');   //引用fs,后面例子默认引用

//判断path是文件还是路径
let path='hello.js';
fs.stat(path, (error, stats) =>{
    if(error){
        console.log(error)
    } else{
        console.log(stats)
        console.log(`文件:${stats.isFile()}`)
        console.log(`目录:${stats.isDirectory()}`)
    }
})

stat 接受两个参数:

  • 第一个是目录名
  • 第二个是回调函数,产生一个对象 stats ,该对象包含了该文件或目录的具体信息,例子中分别使用 isFile 和 isDirectory 来判断当前操作的是文件还是目录,取值为 true 和 false。
2. fs.mkdir()

mkdir 方法用于新建目录。

fs.mkdir('hello',0777, (error) => {
    if(error){
        console.log(error)
    } else {
        console.log('成功创建目录:hello')
    }
})

mkdir 接受三个参数:

  • 第一个是目录名
  • 第二个是目录的读写权限值,默认取0777,表示所有人可读,可写,可执行
  • 第三个是回调函数。
3. fs.writeFile()

writeFile 方法用于写入文件。

fs.writeFile('hello/index.js', 'hello,index', (error) => {
    if(error) {
        console.log(error)
    } else {
        console.log('成功写入文件') 
    }
})

writeFile 接受三个参数:

  • 第一个是目录文件名
  • 第二个是文件内容
  • 第三个是回调函数。
4. fs.appendFile()

appendFile 方法用于追加文件内容。

fs.appendFile('hello/index2.js', 'hello,index2', (error) => {
    if(error) {
        console.log(error)
    } else {
        console.log('成功写入文件') 
    }
})

如果hello目录中不存在 index2.js 文件,则创建 index2.js 文件,并写入内容,如果已经存在,则在文件中追加内容。

5. fs.readFile()

readFile 方法用于异步读取数据。

fs.readFile('hello/index.js', 'utf8',(error, data) =>{
    if (error) {
        console.log(error)
    } else {
        console.log(data) 
    }
})

readFile 接受三个参数:

  • 第一个是文件的路径,可以是绝对路径,也可以是相对路径。
  • 第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串。默认的配置对象是{ encoding: null, flag: 'r'},即文件编码默认为 null ,读取模式默认为 r(只读)。如果第二个参数不指定编码(encoding),readFile 方法返回一个 Buffer 实例,否则返回的是一个字符串。
  • 第三个是回调函数,其中 data 代表文件内容的实例。
6. fs.readdir()

readdir 方法用于读取目录,返回一个所包含的文件和子目录的数组。

fs.readdir('hello', (error, files) =>{
    if (error) {
        console.log(error)
    } else {
        var count = files.length;
        var results = {};
        files.forEach(function (filename) {
            fs.readFile(filename, function (data) {
                results[filename] = data;
                count--;
                if (count <= 0) {
                    // 对所有文件进行处理
                }
            });
        });
    }
})

readdir 接受两个参数:

  • 第一个是目录。
  • 第二个是回调函数,files 是一个该目录下所有的文件和子目录的数组,上述操作中读取目录并对files数组进行操作。
7. fs.rename()

rename 方法重命名目录或文件名。

fs.rename('hello/index.js', 'hello/index1.js',(error) =>{
    if (error) {
        console.log(error)
    } else {
        console.log('重命名成功')
    }
})
8. fs.unlink()

unlink 方法用来删除目录。

fs.unlink('hello/index1.js', (error) =>{
    if (error) {
        console.log(error)
    } else {
        console.log('删除文件成功')
    }
})
9. fs.rmdir()

rmdir 方法用来删除目录。

fs.rmdir('hello', (error) =>{
    if (error) {
        console.log(error)
    } else {
        console.log('删除目录成功')
    }
})
10. fs.createReadStream()

createReadStream 方法用于打开大型的文本文件,创建一个读取操作的数据流。这里大型文本文件指的是文本文件的体积很大,读取操作的缓存装不下,只能分成几次发送,每次发送会触发一个 data 事件,发送结束会触发 end 事件。

// 创建一个读取流,读取文件 hello/index.js 
const fileReadStream = fs.createReadStream('hello/index.js')
let count=0,//记录读取次数
    result='';

//on监听每一次读取操作
fileReadStream.on('data', (data) => {
    console.log(`${ ++count } 接收到:${data}`);
    result+=data;
})
//读取完成
fileReadStream.on('end', () => {
    console.log('--- 读取结束 ---');
    console.log(count);
    console.log(result);
})
//错误读取
fileReadStream.on('error', (error) => {
    console.log(error);
})
11. fs.createWriteStream()

createWriteStream 方法创建一个写入数据流对象,该对象的 write 方法用于写入数据,end 方法用于结束写入操作。

// 创建一个写入流,写入到文件 hello/index2.js 中
const writerStream = fs.createWriteStream('hello/index2.js',{
  encoding: 'utf8'
});

let text = '我是要写入的数据',//写入数据
    count=0;    //记录写入次数

//写入数据
writerStream.write(text);
// 每次完成写入,监听 finish 事件
writerStream.on('finish', function() {
    console.log(`${++count} 写入完成`);
});
//全部写入完成
writerStream.end();
//错误写入
writerStream.on('error', function(error){
    console.log(error);
});
12. createWriteStream 方法和 createReadStream 方法结合使用,可以实现拷贝大型文件。
function fileCopy(filename1, filename2, callback) {
  var input = fs.createReadStream(filename1);
  var output = fs.createWriteStream(filename2);

  input.on('data', function(d) { output.write(d); });
  input.on('error', function(err) { throw err; });
  input.on('end', function() {
    output.end();
    if (callback) callback();
  });
}

这里定义了一个 fileCopy 方法,接受三个参数:

  • 第一个是需复制的文件路径。
  • 第二个要复制出的文件路径。
  • 第三个是复制完成后执行的回调函数。