我正在处理一个文件上传器脚本,该脚本创建一个新文件夹(基于时间戳)并将上载的文件移动到创建的文件夹中。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很棒:)