目錄
- 問題
- 解決
- 方法一、createReadStream 和 createWriteStream
- 方法二、mv
- 結尾
上一篇文章,我們介紹了 fs.renameSync 方法的兩種報錯類型,也分别介紹了解決方法。其實在解決 fs.renameSync 跨區移動檔案時,也有别的解決方法,下面我們就來一起看一看。
今天介紹解決 fs.renameSync 跨區移動檔案報錯的問題,一種有兩種方法,接下來分别介紹。
可以先使用 fs 庫的 createReadStream 方法打開并讀取源檔案内容,同時建立讀取流,然後使用 fs 庫的 createWriteStream 方法建立目标檔案同時打開寫入流。之後利用管道方法 pipe,建立二者的關系。最後,監聽讀取流的結束事件,當事件觸發時删除源檔案。
下面是整個過程的代碼執行個體,請參考:
var fs = require('fs');
var is = fs.createReadStream('/a/b/source/file');
var os = fs.createWriteStream('/c/d/destination/file');
is.pipe(os);
is.on('end',function() {
fs.unlinkSync('source_file');
});
複制代碼
現在,我們來介紹第二種方法。這次不使用 fs 系統庫,而是使用了第三庫 mv。
使用之前,首先需要安裝,指令如下:
npm i mv
然後是引入庫,代碼如下:
var mv = require('mv');
mv 方法可以隻有兩個參數,第一個參數是源檔案的位址,第二個參數是目标檔案的位址。其實,這是 mv 方法的預設使用方式,原理上是首先使用系統的 fs.rename 方法,如果有問題,就會回退上面介紹的第一種方法。具體的使用執行個體代碼如下:
mv('/a/b/source/file', '/c/d/destination/file', function(err) {
// done. it tried fs.rename first, and then falls back to
// piping the source file to the dest file and then unlinking
// the source file.
});
複制代碼
當然,我們也可以顯示的啟動 mv 方法的第三個參數,主動設定一些政策,比如下面的方法,就是首先建立所有需要的目錄,再進行上面的邏輯。代碼參考如下:
mv('/a/b/source/file', '/c/d/destination/file', {mkdirp: true}, function(err) {
// done. it first created all the necessary directories, and then
// tried fs.rename, then falls back to using ncp to copy the dir
// to dest and then rimraf to remove the source dir
});
複制代碼