问题描述
我被我的脚本困住了。 我的目标是:我有一个图像文件夹,想将它们分割并移动到多个其他文件夹(始终存在)。 文件夹限制为 200 个文件,在我的循环中,在第一个文件夹成功填充 200 个文件后,在第二个文件夹的第二个文件中,我总是收到错误:
Error: ENOENT: no such file or directory,rename '/home/.../chunkDirsMoveFiles/input/resize/20150818_051550_web.jpg' -> './output/dir_2/20150818_051550_web.jpg'] {
errno: -2,code: 'ENOENT',syscall: 'rename',path: '/home/.../chunkDirsMoveFiles/input/resize/20150818_051550_web.jpg',dest: './output/dir_2/20150818_051550_web.jpg'
}
我的代码(我猜问题通常从 currentdir = 1 开始):
const { clear } = require("console");
const fs = require("fs")
const path = require("path")
// const { fileSystemHelper } = require('../allhelpers/fileSystemHelper.js')
const dirLimit = 200
clear()
// Fn to get all file paths of the input folder
const getAllFiles = function(dirPath,arrayOfFiles) {
files = fs.readdirsync(dirPath)
arrayOfFiles = arrayOfFiles || []
files.forEach(function(file) {
if (fs.statSync(dirPath + "/" + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + "/" + file,arrayOfFiles)
} else {
arrayOfFiles.push(path.join(__dirname,dirPath,"/",file))
}
})
return arrayOfFiles
}
const images = getAllFiles("input/resize")
const dirAmount = Math.round(images.length/dirLimit)
for (let i = 0; i < dirAmount; i++) {
fs.mkdir(`./output/dir_${i + 1}`,function(err) {
// if (err) {
// console.log(err)
// } else {
// console.log("New directory successfully created.")
// }
})
}
currentDir = 1
for (let i = 0; i < dirAmount; i++) {
for (let k = 0; k < dirLimit; k++) {
const theFilePath = images[k].split('/')
const newPath = theFilePath[(theFilePath.length)-1]
fs.rename(images[k],`./output/dir_${currentDir}/${newPath}`,function (err) {
if (err) throw err
console.log('Successfully renamed/moved!')
})
}
currentDir += 1
}
解决方法
查看循环:对于每个目录,您最多获取 < dirLimit
个文件并将它们全部移动到该目录(即 200 个第一个文件)。然后,对于下一个目录,循环执行相同的操作:从数组的开头获取 200 个文件……但是嘿!文件已移至上一次迭代中的上一个目录。
循环不使用 i
,也不会遍历文件列表。