fs.rename ENOENT: нет такого файла или каталога - PullRequest
0 голосов
/ 28 августа 2018

У меня проблемы с использованием fs.rename в приложении node.js. Я уже использую функцию ниже, и она работает так, как я ожидаю, что она будет работать.

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' }

было бы здорово, если бы вы могли мне помочь. Я видел, что у некоторых других людей были подобные проблемы в прошлом, но я не нашел ответа, который мог бы заставить меня понять проблему.

Спасибо, спасибо

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

спасибо за ответ.

Я вроде исправил это. Код сейчас беспорядок, но, по крайней мере, он делает то, что должен.

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();
            });
        });
    });
}
0 голосов
/ 28 августа 2018

Вы переименовываете файл .../9_Whg_Nr_22/7_bob в .../9_Whg_Nr_221/7_bob

Это будет работать, только если каталог 9_Whg_Nr_221 уже существует, и я предполагаю, что он не существует, и fs.rename не не создаст этот каталог для вас.

В таких ситуациях, когда целевой каталог еще может не существовать, сначала необходимо вручную создать каталог, например, используя mkdirp.

...