天天看點

如何解決 fs.renameSync() 跨區移動檔案的問題

目錄

  • 問題
  • 解決
  • 方法一、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
});
複制代碼      

繼續閱讀