我正在处理文件上传程序脚本,该脚本会创建一个新文件夹(基于时间戳)并将上传的文件移动到创建的文件夹中。
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
一切正常。
答案 0 :(得分:0)
好的一些事情......
你真的应该开始使用promises,使代码更容易阅读,错误处理方式更优越。我通常使用when.js,但还有其他选择
您应该抛出错误或返回错误,或者即使先前的操作失败,您也会尝试继续运行该功能。
if (err) console.error(err);
应该是
if (err) thorw err;
答案 1 :(得分:0)
我猜这里会发生某种竞争状况 这种东西容易出错,难以正确使用。
我通常使用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
,无论有多少嵌套目录