ENOENT:Node.js 脚本 fs.rename,用于将文件从 1 个文件夹分割和移动到多个其他文件夹

问题描述

我被我的脚本困住了。 我的目标是:我有一个图像文件夹,想将它们分割并移动到多个其他文件夹(始终存在)。 文件夹限制为 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,也不会遍历文件列表。