gpt4 book ai didi

javascript - 同时添加 2 个文件时重命名文件失败

转载 作者:行者123 更新时间:2023-12-03 12:28:07 25 4
gpt4 key购买 nike

下面的脚本在监视文件夹中是否有新的 .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');// watch the directory for new filesfs.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  // check we have the right file type  var filePath = path.join(baseDir, file);  if(fs.existsSync(filePath) && ext === '.ogg'){    // get the created date    var stats = fs.statSync(filePath);    var name = getName(stats);    // if the directory doesnt exist    var baseDirPath = path.join(baseDir, basename);    if(!fs.existsSync(baseDirPath)){      // make the directory      fs.mkdirSync(baseDirPath, 0777);    }    moveFile(file, basename, name, ext);  }});function getName (stats) {  var year = stats.ctime.getFullYear();  var month = stats.ctime.getMonth()+1;  var day = stats.ctime.getDate();  var hour = stats.ctime.getHours();  // need minutes!  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){    hour = '0' + hour;  }  if(minutes < 10){    minutes = '0' + minutes;  }  if(sec < 10){    sec = '0' + sec;  }  // missing the minute, previously  return year + '' + month + '' + day + '' + hour + '' + minutes + '' + sec;}function moveFile(file, basename, name, ext){  // move the file to the new directory  var src = path.join(baseDir, file),      dest = path.join(baseDir, basename, name+ext);  console.log("Moving ", src, "-", dest);  fs.renameSync(src, dest);}

一些提示/更正:

  1. 在处理此类简单脚本时,坚持使用以 Sync 结尾的同步 fs 方法。虽然 Node.js 以其异步能力而闻名,但在我看来,它有点过早的优化。例如,如果您需要将其嵌入到高性能网络服务器中,请在此时进行优化,而不是在此之前。

  2. 创建新文件名时缺少分钟变量。这很有可能导致名称冲突,所以我纠正了它。

  3. 尝试更多地使用 path 库(例如 path.join),因为手动连接路径字符串通常会导致代码脆弱。

  4. 仍有几种边缘情况可能会导致崩溃。创建一个不带扩展名的文件,该文件与您将基于另一个文件创建的目录同名。 (文件不能成为目录,并且不能将文件移动到另一个文件中。)。如果您计划进入生产环境,您将需要至少通过一些单元测试来强化代码。

干杯,

关于javascript - 同时添加 2 个文件时重命名文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com