Node.js 使用 fs 模块做文件 copy 的四种方法

Posted 雪松

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js 使用 fs 模块做文件 copy 的四种方法相关的知识,希望对你有一定的参考价值。

首先引入文件模块 var fs = require(\'fs\');

Method 1

function copy(src, target) 
    console.log(target);
    fs.writeFileSync(target, fs.readFileSync(src));
  • 代码简短清晰
  • 同步读取文件,容易阻塞
  • 读取大文件时,容易内存溢出
  • 尝试复制一个1.5G的电影 结果内存轻松溢出如图

Method 2

function copy(src, target) 
    var rs = fs.createReadStream(src),
        ws = fs.createWriteStream(target);

    fs.on(\'data\', function(chunk) 
        console.log(\'read\');
        ws.write(chunk, function() 
            console.log(\'write\');
        )
    )

    fs.on(\'end\', function() 
        ws.end();
    )
  • 读取大文件时不太容易导致内存溢出
  • 代码比较复杂
  • 由于读取和写入的速度不一样,同样存在内存溢出的风险,不过比 Method 1 好很多

Method 3

根据 Method 2 改进

function copy(src, target) 
    var rs = fs.createReadStream(src),
        ws = fs.createWriteStream(target);

    fs.on(\'data\', function(chunk) 
        console.log(\'read\');
        if (ws.write(chunk, function() 
                console.log(\'write\');
            ) === false) 
            rs.pause();
         else 
            rs.resume();
        
    )

    fs.on(\'end\', function() 
        ws.end();
    )
  • 同步了读取和写入的速度,没有内存溢出的风险
  • 代码比较复杂

Method 4

node中支持pipe方法,类似于管道,将读出来的内容通过管道写入到目标文件中

function copy(src, target) 
    fs.createReadStream(src).pipe(fs.createWriteStream(target));
  • 代码简洁
  • 没有内存溢出的风险

1.64G 的文件用了20秒复制完毕,没有内存溢出

node.js 使用fs模块对系统文件及目录进行读写操作

如果要用这个模块,首先需要引入,fs已经属于node.js自带的模块,所以直接引入即可

var fs = require('fs');
1.读取文件readFile方法使用

fs.readFile(filename,[option],callback) 方法读取文件。

参数说明:

  • filename String 文件名
  • option Object
    • encoding String |null default=null
    • flag String default='r'
  • callback Function
// 设置编码格式
fs.readFile('./test.txt', 'utf-8', function(err, data) 
    // 读取文件失败/错误
    if (err) 
        throw err;
    
    // 读取文件成功
    console.log('utf-8: ', data.toString());
);
2.写入文件writeFile方法使用

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

参数说明:

  • filename String 文件名
  • data String|buffer
  • option Object
    • encoding String |nulldefault='utf-8'
    • mode Number default=438(aka 0666 in Octal)
    • flag Stringdefault='w'
  • callback Function
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);
    );
);

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

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

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);
    );
);
3.创建目录mkdir使用

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

var fs = require('fs'); // 引入fs模块

// 创建 newdir 目录
fs.mkdir('./newdir', function(err) 
    if (err) 
        throw err;
    
    console.log('make dir success.');
);
4.读取目录readdir

var fs = require('fs'); // 引入fs模块

fs.readdir('./newdir', function(err, files) 
    if (err) 
        throw err;
    
    // files是一个数组
    // 每个元素是此目录下的文件或文件夹的名称
    console.log(files);
);
5.删除文件unlink

var fs = require('fs'); // 引入fs模块

fs.unlink('./newfile.txt', function(err) 
    if (err) 
        console.log(err);
        return false;
    
    console.log("success");
);

6.删除空文件夹rmdir

var fs = require('fs'); // 引入fs模块

fs.rmdir('./newdir', function(err) 
    if (err) 
        console.log(err);
        return false;
    
    console.log("success");
);







以上是关于Node.js 使用 fs 模块做文件 copy 的四种方法的主要内容,如果未能解决你的问题,请参考以下文章

Node.js文件系统(fs模块的使用)

node js fs模块

初识 Node.js 丨fs 文件系统模块

node.js 使用fs模块对系统文件及目录进行读写操作

node.js的fs核心模块读写文件操作 -----由浅入深

解决node.js使用fs读取文件出错