我遇到了麻烦,然后在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' }
如果你能帮助我会很棒。我见过其他人过去也遇到过类似的问题,但我找不到任何可以让我理解这个问题的答案。
谢谢你
您正在将文件.../9_Whg_Nr_22/7_bob
重命名为.../9_Whg_Nr_221/7_bob
这只有在目录9_Whg_Nr_221
已经存在的情况下才有效,而我的猜测是它没有,并且fs.rename
不会为你创建该目录。
在目标目录可能尚不存在的这些情况下,您必须首先手动创建目录,例如使用mkdirp
。
谢谢你的回应。
我有点修理它。代码现在很乱,但至少它应该做到了。
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();
});
});
});
}