当同时添加2个文件时,重命名文件失败
Renaming files fails when 2 are added simultaneously
当监视文件夹中新的.ogg文件时,下面的脚本工作得非常好。它成功地创建了一个具有新文件名的文件夹,然后根据文件的创建日期/
重命名该文件。然而,当我在脚本尝试创建一个已经存在的文件夹时同时添加多个文件时,问题就出现了,这表明它不知何故混淆了两个文件名。有人能告诉我哪里做错了吗?我认为它的代码结构很简单,虽然我不知道为什么。
var baseDir = './',
path = require('path'),
fs = require('fs');
// watch the directory for new files
fs.watch(baseDir, function(event, file) {
var ext = path.extname(file)
basename = path.basename(file).substring(0, path.basename(file).length - ext.length);
// check it wasnt a delete action
fs.exists(baseDir + file, function(exists) {
// check we have the right file type
if(exists && ext === '.ogg'){
// get the created date
fs.stat(baseDir + file, function (err, stats){
if (err)
throw err;
var year = stats.ctime.getFullYear();
var month = stats.ctime.getMonth()+1;
var day = stats.ctime.getDate();
var hour = stats.ctime.getHours();
var sec = stats.ctime.getSeconds();
if(month < 10){
month = '0' + month;
}
if(day < 10){
day = '0' + day;
}
if(hour < 10){
hour = '0' + hour;
}
if(sec < 10){
sec = '0' + sec;
}
var name = year + '' + month + '' + day + '' + hour + '' + sec;
// does the basename directory exist?
fs.exists(baseDir + '/' + basename, function(exists) {
// if the directory doesnt exist
if(!exists){
// make the directory
fs.mkdir(baseDir + '/' + basename, 0777, function (err, stats){
if (err)
throw err;
moveFile(file, basename, name, ext);
});
} else {
moveFile(file, basename, name, ext);
}
});
});
}
});
});
function moveFile(file, basename, name, ext){
// move the file to the new directory
fs.rename(baseDir + file, baseDir + '/' + basename + '/' + name + ext, function (err) {
if (err)
throw err;
// console.log('Rename complete');
});
}
好的,所以我有几分钟的空闲时间,决定去看看你。我对你的代码做了一点重构,但基本结构应该很容易识别。
<>之前var baseDir = './test',Path = require(' Path '),Fs = require(' Fs ');//查看目录是否有新文件fs。watch(baseDir, function(event, file)) {Var ext = path.extname(文件);Basename = path.basename(文件)。substring (0, path.basename(文件)。长度- ext.length);//检查是否为删除操作//检查文件类型是否正确var filePath = path。加入(baseDir、文件);if(fs.existsSync(filePath) && ext === '.ogg'){//获取创建的日期var stats = fs.statSync(filePath);var name = getName(stats);//如果目录不存在var baseDirPath = path。加入(baseDir basename);如果(! fs.existsSync (baseDirPath)) {//创建目录fs。mkdirSync (baseDirPath, 0777);}moveFile(文件,basename, name, ext);}});函数getName (stats) {var year = stats.ctime.getFullYear();var month = stats.ctime.getMonth()+1;var day = stats.ctime.getDate();var hour = stats.ctime. gehours ();//需要几分钟!var minutes = stats.ctime.getMinutes();var sec = stats.ctime.getSeconds();If (month %lt 10){Month = '0' + Month;}If (day <10){Day = '0' + Day;}If (hour <10){小时= '0' +小时;}If (minutes <10){Minutes = '0' + Minutes;}If (sec <10){SEC = '0' + SEC;}//错过分钟,先前返回年+ " +月+ " +日+ " +小时+ " +分钟+ " +秒;}函数moveFile(文件,basename, name, ext){//移动文件到新目录Var SRC = path。加入(baseDir、文件),Dest = path。join(baseDir, basename, name+ext);console.log("Moving ", src, "-", dest);fs。renameSync (src, dest);}之前一些技巧/修正:
在处理像这样的简单脚本时,坚持使用以Sync结束的同步
fs
方法。虽然node.js以其异步能力而闻名,但在我看来,这是一个过早的优化。例如,如果你需要将它嵌入到高性能的web服务器中,请在此时进行优化,而不是在此之前。您在创建新文件名时缺少
minutes
变量。这很有可能导致名称冲突,所以我纠正了它。尝试使用
path
库(如path.join
)更有利于您,因为手动连接路径字符串通常会导致脆弱的代码。仍然有几个可能崩溃的边缘情况。创建一个没有扩展名的文件,该文件将与基于另一个文件创建的目录同名。(文件不能变成目录,你也不能把一个文件移到另一个文件中。)如果您计划进入生产环境,您将需要使用至少几个单元测试来强化代码。
欢呼,丹
相关文章:
- 正在使用Dropzone.js删除服务器上已重命名的文件
- 如何使用laravel重命名已存储在服务器中的文件
- gulp重命名多个文件
- 使用 gruntjs 自定义初始化任务重命名模板文件夹
- 重命名上传的文件Ruby On Rails
- 导出时如何重命名excel文件
- 重命名Alfresco脚本中的文件
- 我正在尝试将javascript文本框的输入保存回服务器.我想从保存的弹出文本框中获得输入,以重命名文件夹
- 使用AjaxForm Jquery重命名文件
- 批量文件重命名
- 在S3中上传之前重命名文件
- 在multer中重命名上载的文件
- 仅对文件进行 Gulp 重命名,而不重命名目录
- 有没有办法让我的.js文件自毁,或重命名自己,或者在一次使用后将自己移动到新位置
- 重命名上传的文件,以便可以将其删除 DropZone.js
- Phonegap使用moveTo重命名文件
- 将html文件重命名为php时编码错误
- 将块大小的文件重命名为Blob
- ruby on rails-将我的文件重命名为.js.erb可以在javascript中编写erb,但不能在erb中编写
- 使用AngularJS和ng文件上传在文件重命名时保持原始格式