[node.js] fs.renameSync()報錯



  初學node.js,跟着node入門,操作了一遍。在最后一步,上傳圖片並顯示時遇到報錯

 fs.js:115
    throw err;
    ^
    Error: ENOENT: no such file or directory, rename 'C:\Users\catcher\AppData\Local\Temp\upload_16f7bede547980c767e1e031a3720f67' -> '/tmp/test.png'
    at Object.renameSync (fs.js:594:3)
    at C:\IdeaProjects\nodejs\requestHandlers.js:34:8
    at IncomingForm.<anonymous> (C:\IdeaProjects\nodejs\node_modules\formidable\lib\incoming_form.js:107:9)
    at IncomingForm.emit (events.js:182:13)
    at IncomingForm._maybeEnd (C:\IdeaProjects\nodejs\node_modules\formidable\lib\incoming_form.js:557:8)
    at C:\IdeaProjects\nodejs\node_modules\formidable\lib\incoming_form.js:238:12
    at WriteStream.<anonymous> (C:\IdeaProjects\nodejs\node_modules\formidable\lib\file.js:79:5)
    at Object.onceWrapper (events.js:273:13)
    at WriteStream.emit (events.js:182:13)
    at finishMaybe (_stream_writable.js:641:14)

    
根據報錯信息,查找到相應的代碼,

fs.renameSync(files.upload.path, "/tmp/test.png");


首先想到的是代碼中是相對路徑,導致不能查找到文件所在的位置,於是將路徑補全

fs.renameSync(files.upload.path,"C:/IdeaProjects/nodejs/tmp/test.png");


還是同樣的報錯

Error: ENOENT: no such file or directory, rename 'C:\Users\catcher\AppData\Local\Temp\upload_cb107f6decde929aff2b86f5bfb3a330' -> 'C:/IdeaProjects/nodejs/tmp/test.png'

    
仔細觀察后發現在路徑名中可能存在的左右反斜杠的問題。即在windows中路徑名間隔符為右反斜杠'\',而在Linux和mac os中都是左反斜杠'/'。於是修改代碼為

fs.renameSync(files.upload.path,"C:\IdeaProjects\nodejs\tmp\test.png");

依然報錯

Error: ENOENT: no such file or directory, rename 'C:\Users\catcher\AppData\Local\Temp\upload_5b3fdf35fbb17a8579b5c2245f070543' -> 'C:IdeaProjects  odejs   mp      est.png'

    
問題在於右反斜杠是轉義字符,所以路徑名稱應該為

fs.renameSync(files.upload.path,"C:\\IdeaProjects\\nodejs\\tmp\\test.png");

遺憾的是依然報錯,

Error: ENOENT: no such file or directory, rename 'C:\Users\catcher\AppData\Local\Temp\upload_d3cceb8f8c01ae2a796d1f356e91ae0f' -> 'C:\IdeaProjects\nodejs\tmp\test.png'

不過顯示的路徑算是對了。
再次閱讀報錯信息后 no such file or directory ,會不會是文件夾tmp需要手動創建?(沒錯,我以為該方法會自動創建不存在的文件夾,所以在一開始我還嘗試通過everything去查找tmp文件夾)自己創建文件夾tmp之后,成功上傳圖片並預覽。
而之前反復改動的文件路徑,以下三種方式親測可用:

fs.renameSync(files.upload.path, "./tmp/test.png"); //注意點號

fs.renameSync(files.upload.path, "C:\\IdeaProjects\\nodejs\\tmp\\test.png");

fs.renameSync(files.upload.path, "C:/IdeaProjects/nodejs/tmp/test.png");

 


附:在網上查詢資料,提到fs.renameSync() 不允許跨分區移動文件。解決辦法如下:

https://stackoverflow.com/questions/4568689/how-do-i-move-file-a-to-a-different-partition-or-device-in-node-js
   

 1  var fs = require('fs');
 2  //var util = require('util');
 3  var is = fs.createReadStream('source_file');
 4  var os = fs.createWriteStream('destination_file');
 5  is.pipe(os);
 6  is.on('end',function() {
 7     fs.unlinkSync('source_file');
 8  });
 9  /* node.js 0.6 and earlier you can use util.pump:
10  util.pump(is, os, function() {
11      fs.unlinkSync('source_file');
12  });
13  */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM