Love.Passion.Dream

Node.js对本地文件的剪切与复制

有了Node.js,更纯粹的js跨平台文件处理脚本靠谱了!

用Node处理本地文件主要是依靠node自带的fs的包,它提供了很多api可以直接操作文件。嗯,那把bat脚本移植过去........

咦?肿么没有复制剪切的接口?什么情况?

首先来看看剪切吧,剪切和复制不同,剪切只是把硬盘中文件系统的文件链接改了,文件内容存放的实际地方还是不变的。但是复制就不一样了,它还需要再拷贝一份数据。这就是为什么在同一个磁盘下面剪切会比复制快很多。当然磁盘直接就不一样了,在windows下面不同的分区可以看作是两个完全独立的文件系统,所以速度不会比复制快,甚至还多出删除的时间。所以大伙拷贝什么东西还是不用剪切了吧,还能防止异常中断导致的数据丢失。

嗯,上面说这么一段主要是想说的是剪切的道理其实就是重命名,so,使用rename或者renameSync就可以达到剪切的效果了。当然,不同的分区之间是不行的。

fs = require('fs');
fs.renameSync('./1.txt', './doc/3.txt');
fs.renameSync('./src/3.txt', 'D:\\3.txt');

我是在E盘忠运行上面的的代码,第二行是没有问题的,第三行符合预期报了错误,错误如下:

那复制怎么办?先直接上代码:

fs = require('fs');
var util = require("util");
//fs.renameSync('./1.txt', './doc/3.txt');
//fs.renameSync('./src/3.txt', 'D:\\3.txt');

//copy a file
function copyFile(src, dst){
    var is = fs.createReadStream(src);
    var os = fs.createWriteStream(dst);
    util.pump(is, os, function(err){
        if(err){
            //copy error
        }
    });
}

copyFile('./src/3.txt', 'D:\\3.txt');

这段代码运行下来,也是没有问题的,这就达到了复制的目的。使用了util中的pupm,它会持续的传输数据流到结束。但是这个方法貌似没有它的同步版本。嗯,为什么呢?那如果需要同步拷贝数据怎么办?还有就是跨分区的剪切是不是就只能是拷贝再删除?这些问题先放着,今天好冷啊,打这么点字手都冻僵了.....

参考链接:https://gist.github.com/807712 https://github.com/ryanmcgrath/wrench-js https://gist.github.com/992478 http://stackoverflow.com/questions/4980243/how-to-copy-a-file