nodejs的fs
模組並沒有提供乙個copy
的方法,但我們可以很容易的實現乙個,比如:
var source = fs.readfilesync('/path/to/source', );
fs.writefilesync('/path/to/dest', source);
如上面高大上的所示,我們把檔案比作裝水的桶,而水就是檔案裡的內容,我們用一根管子(pipe)連線兩個桶使得水從乙個桶流入另乙個桶,這樣就慢慢的實現了大檔案的複製過程。
stream
在nodejs中是eventemitter
的實現,並且有多種實現形式,例如:
上面的檔案複製可以簡單實現一下:
var fs = require('fs');
var readstream = fs.createreadstream('/path/to/source');
var writestream = fs.createwritestream('/path/to/dest');
readstream.on('data', function
(chunk)
);readstream.on('end', function
());
上面的寫法有一些問題,如果寫入的速度跟不上讀取的速度,有可能導致資料丟失。正常的情況應該是,寫完一段,再讀取下一段,如果沒有寫完的話,就讓讀取流先暫停,等寫完再繼續,於是**可以修改為:
var fs = require('fs');
var readstream = fs.createreadstream('/path/to/source');
var writestream = fs.createwritestream('/path/to/dest');
readstream.on('data', function
(chunk)
});writestream.on('drain', function
());
readstream.on('end', function
());
或者使用更直接的pipe
// pipe自動呼叫了data,end等事件
fs.createreadstream('/path/to/source').pipe(fs.createwritestream('/path/to/dest'));
下面是乙個更加完整的複製檔案的過程
var fs = require('fs'),
path = require('path'),
out = process.stdout;
var filepath = '/users/chen/movies/game.of.thrones.s04e07.1080p.hdtv.x264-batv.mkv';
var readstream = fs.createreadstream(filepath);
var writestream = fs.createwritestream('file.mkv');
var stat = fs.statsync(filepath);
var totalsize = stat.size;
var passedlength = 0;
var lastsize = 0;
var starttime = date.now();
readstream.on('data', function
(chunk)
});readstream.on('end', function
());
writestream.on('drain', function
());
settimeout(function
show
() else
}, 500);
可以把上面的**儲存為copy.js
試驗一下
我們新增了乙個遞迴的settimeout
(或者直接使用setinterval)來做乙個旁觀者,每500ms觀察一次完成進度,並把已完成的大小、百分比和複製速度一併寫到控制台上,當複製完成時,計算總的耗費時間,效果如圖:
我們複製了一集1080p的權利的遊戲第四季第7集,大概3.78g大小,由於使用了ssd,可以看到速度還是非常不錯的,哈哈哈~
複製完成後,顯示總花費時間
結合nodejs的readline
,process.argv
等模組,我們可以新增覆蓋提示、強制覆蓋、動態指定檔案路徑等完整的複製方法,有興趣的可以實現一下,實現完成,可以
ln -s /path/to/copy.js /usr/local/bin/mycopy
這樣就可以使用自己寫的mycopy
命令替代系統的cp
命令 Nodejs中流的操作
fs與流都可以處理檔案,為什麼還要用流 fs模組處理檔案的缺點 將檔案的資料全讀到記憶體中,在把資料寫到檔案內,會大量占用記憶體 流 流 stream 是 node.js 中處理流式資料的抽象介面,是一組有序的,有起點和終點的位元組資料傳輸手段。可以實現將資料從乙個地方流動到另乙個地方,其邊讀取邊寫...
nodeJS基礎 Stream用法
stream是nodejs的乙個核心模組,在nodejs中應用非常廣泛,比如http 伺服器request和response物件都是流 可讀流的用法 let fs require fs let path require path let rs fs.createreadstream path.joi...
了解nodeJs中的流(stream)
nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...