fs.rename ENOENT:没有这样的文件或目录

问题描述 投票:0回答:2

我遇到了麻烦,然后在node.js应用程序中使用fs.rename。我已经使用下面的功能,它可以正常工作。

var fs =require("fs");
var path =require("path")
module.exports= function(oldPath, newPath){
    oldPath=path.join(__dirname, "..", "documents", "bka" , oldPath);
    newPath=path.join(__dirname, "..", "documents", "bka" , newPath);
    fs.rename(oldPath, newPath, (err)=>{if (err) console.log(err)});
}

然后我尝试将该函数用于另一个案例。 oldPath存在。 newPath不存在。如果我不更改newPath,则不会发生错误。如果我更改它,则会发生以下错误,我不明白为什么:

{ Error: ENOENT: no such file or directory, rename '/home/ubuntu/workspace/documents/bka/7_Wall Street_1/9_Whg_Nr_22/7_bob' -> '/home/ubuntu/workspace/documents/bka/7_Wall Street_1/9_Whg_Nr_221/7_bob' at Error (native) errno: -2, code: 'ENOENT', syscall: 'rename', path: '/home/ubuntu/workspace/documents/bka/7_Wall Street_1/9_Whg_Nr_22/7_bob', dest: '/home/ubuntu/workspace/documents/bka/7_Wall Street_1/9_Whg_Nr_221/7_bob' }

如果你能帮助我会很棒。我见过其他人过去也遇到过类似的问题,但我找不到任何可以让我理解这个问题的答案。

谢谢你

node.js fs
2个回答
0
投票

您正在将文件.../9_Whg_Nr_22/7_bob重命名为.../9_Whg_Nr_221/7_bob

这只有在目录9_Whg_Nr_221已经存在的情况下才有效,而我的猜测是它没有,并且fs.rename不会为你创建该目录。

在目标目录可能尚不存在的这些情况下,您必须首先手动创建目录,例如使用mkdirp


0
投票

谢谢你的回应。

我有点修理它。代码现在很乱,但至少它应该做到了。

var path =require("path");
var mkdirp =require("mkdirp");
var shell = require("shelljs");
var Promise= require("bluebird");
module.exports= function(oldPath, newPath){
    oldPath=path.join(__dirname, "..", "documents", "bka" , oldPath);
    newPath=path.join(__dirname, "..", "documents", "bka" , newPath);
    var oldArr= oldPath.split("/");
    var newArr= newPath.split("/");     
    var np="";
    var op="";
      var createDir=(path)=>{
        return new Promise((resolve)=>{
            mkdirp(path, (err)=>{
                if (err) throw err
                resolve(path)
            });
        });
    }
    
    var copy =(from, to)=>{
        return new Promise((resolve)=>{
            shell.cp("-R",from+"/*", to);
            resolve();
        });
    }
    var rm= (path)=>{
        return new Promise((resolve)=>{
             shell.rm("-R", path);
            resolve();
        });
    }
    
    var results=[]
    for( var i=0; i<oldArr.length; i++){
        op += oldArr[i]+"/";
        np += newArr[i]+"/";
        if(oldArr[i]!= newArr[i]){
            Promise.resolve()
            var result={}
            result.from=op;
            result.to=np;
            results.push(result);
        }
    }
    
    createDir(results[results.length-1].to)
        .then(()=>{ copy(results[results.length-1].from, results[results.length-1].to)
            .then(()=>{rm(results[0].from).then(()=>{
                results.pop();
            });
        });
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.