gpt4 book ai didi

Node.js 将子目录的内容移动到当前目录

转载 作者:太空宇宙 更新时间:2023-11-03 21:56:57 24 4
gpt4 key购买 nike

我有一个 Node 脚本,可以将 zip 下载到 tmp/archive.zip 并将其提取到 tmp/archive

我想将 tmp/archive 的内容移至 . 中。我很难找到如何以相当于 mv tmp/archive/* 的方式使用 fs.rename

我尝试过 fs.rename('tmp/archive/*', '.', function(err){ 但出现以下错误: Error: ENOENT: no这样的文件或目录,重命名 'tmp/archive/*' -> '.'

我也尝试过使用glob列出 tmp/archive 的内容,然后迭代它并使用 fs-extra 的 move 移动文件,如下所示:

glob('tmp/archive/*', {}, function(err, files){
for (var i = files.length - 1; i >= 0; i--) {
fs.move(files[i], '.', function(err){});
}
}.bind(this));

这会导致以下错误:错误:EEXIST:文件已存在,链接“tmp/archive/subdirectory”->“.”

我可以从脚本中调用mv tmp/archive/* .,但如果可能的话我想避免这种情况。我是否缺少一些明显的东西?我怎样才能做到这一点?

最佳答案

以下是将文件目录从一个位置移动到另一个位置的一种方法(假设它们位于同一卷上,因此可以重命名而不是复制):

var Promise = require('bluebird');
var fs = Promise.promisifyAll(require('fs'));
var path = require('path');

function moveFiles(srcDir, destDir) {
return fs.readdirAsync(srcDir).map(function(file) {
var destFile = path.join(destDir, file);
console.log(destFile);
return fs.renameAsync(path.join(srcDir, file), destFile).then(function() {
return destFile;
});
});
}

// sample usage:
moveFiles(path.join(".", "tempSource"), path.join(".", "tempDest")).then(function(files) {
// all done here
}).catch(function(err) {
// error here
});

这会将 srcDir 中的文件和子目录移动到 destDir。由于 fs.rename() 会一次性移动一个子目录,因此您不必递归遍历。

在设计这样的函数时,您可以选择错误行为。上述实现在出现第一个错误时中止。您可以更改实现以移动所有可能的文件,然后仅返回无法移动的文件列表。

<小时/>

这是一个可以重命名所有文件的版本,如果有任何错误,它会在最后拒绝并列出失败的文件及其错误对象:

function moveFilesAll(srcDir, destDir) {
return fs.readdirAsync(srcDir).map(function(file) {
var destFile = path.join(destDir, file);
var srcFile = path.join(srcDir, file);
return fs.renameAsync(srcFile, destFile).then(function() {
return {file: srcFile, err: 0};
}).catch(function(err) {
console.log("error on " + srcFile);
return {file: srcFile, err: err}
});
}).then(function(files) {
var errors = files.filter(function(item) {
return item.err !== 0;
});
if (errors.length > 0) {
// reject with a list of error files and their corresponding errors
throw errors;
}
// for success, return list of all files moved
return files.filter(function(item) {
return item.file;
});
});
}

// sample usage:
moveFilesAll(path.join(".", "tempSource"), path.join(".", "tempDest")).then(function(files) {
// all done here
}).catch(function(errors) {
// list of errors here
});

关于Node.js 将子目录的内容移动到当前目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38235324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com