我正在处理一个文件上传器脚本,该脚本创建一个新文件夹(基于时间戳)并将上载的文件移动到创建的文件夹中。

Sometimes it works,有时我遇到ENOENT重命名错误(文件/文件夹不存在)。

以下代码在我的发布路线中:

var form = new multiparty.Form({
   uploadDir: "C:"+ path.sep + "files"
});

form.parse(req, function(err, fields, files) {

   var dirPath = "C:"+ path.sep + "files" + path.sep + +new Date;

   fs.mkdir(dirPath, 0777, function(err, dirPath){

      if (err) console.error(err);

      console.log("Created new folder");

      fs.rename(files.file[i].path, dirPath + path.sep + files.file[i].originalFilename, function(err){

         if (err) console.error(err);

         console.log("Moved file");

      });

   }(err, dirPath));

   next();
});


我正在使用express(4)multiparty module
如您所见,我正在使用async函数。

所以问题是:我的代码有什么问题?

编辑

我正在谈论的错误:"Error: ENOENT, rename 'C:\files\7384-1r41cry.png'"

这与比赛条件有关。使用fs.mkdirSync一切正常。

最佳答案

我的猜测是这里发生了某种种族状况。
这种东西很容易出错,很难做到正确。

我通常将gulp用于此类内容,也许您应该:)

将整个目录树复制到其他目录并不容易。

gulp.src('./inputDir/**/*').pipe(gulp.dest('./outputDir')


并且所有来自inputDir的文件都将被复制到outputDir

但是也许应对不是一种选择。文件太大了吧?
让我们对其进行修改,使其以我们想要的方式工作。

var fs = require('fs')
, gulp = require('gulp')
, thr = require('through2').obj
, SRC = './test/**/*.{css,html,js}' // it could be 'my/file/located/here'
, OUT = './output' // it could be 'my/newer/file/located/there'
;


gulp.src(SRC)
.pipe(thr(function(chunk, enc, next){
  chunk.contents = new Buffer('') // cleaning the contents of the file
  chunk._originalPath = chunk.path
  next(null, chunk)
}))
.pipe(gulp.dest(OUT))
.pipe(thr(function(chunk, enc, next){
  // now a place holder file exists at our destination.
  // so we can write to it and being convident it exists
  console.log('moving file from', chunk._originalPath, 'to', chunk.path)
  fs.rename(chunk._originalPath, chunk.path, function(err){
    if (err) return next(err)
    next()
  })
}))


这会将所有css,html和js文件从input移到output,无论有多少嵌套目录

gulp很棒:)

07-24 09:21