当同时添加2个文件时,重命名文件失败

Renaming files fails when 2 are added simultaneously

本文关键字:文件 重命名 失败 2个 添加      更新时间:2023-09-26

当监视文件夹中新的.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);}之前

一些技巧/修正:

  1. 在处理像这样的简单脚本时,坚持使用以Sync结束的同步fs方法。虽然node.js以其异步能力而闻名,但在我看来,这是一个过早的优化。例如,如果你需要将它嵌入到高性能的web服务器中,请在此时进行优化,而不是在此之前。

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

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

  4. 仍然有几个可能崩溃的边缘情况。创建一个没有扩展名的文件,该文件将与基于另一个文件创建的目录同名。(文件不能变成目录,你也不能把一个文件移到另一个文件中。)如果您计划进入生产环境,您将需要使用至少几个单元测试来强化代码。

欢呼,丹