2014-06-06 45 views
0

下面的脚本在为新的.ogg文件监视文件夹时发挥了巨大的作用。它成功创建一个新文件名的文件夹,然后根据文件根据其创建日期重命名文件/当同时添加2时重命名文件失败

然而,当我在脚本尝试创建文件夹的同时添加多个文件时出现问题已经存在,表明它以某种方式混合了这两个文件名。有没有人有任何建议,我可能会做错吗?我认为它的简单代码结构虽然我无法解决原因。

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'); 

    }); 

} 
+0

你想这两个文件在同一目录中结束(和你的代码不这样做)?或者你想每个文件都有一个目录(并且在两个时间戳发生冲突时有问题)? – pixelistik

+0

你应该使用同步调用。当'fs.exists'的回调触发时,文件可能不再存在。你可以用'fs.existsSync'来避免这个问题。 (所有'fs'调用也是如此) –

+0

几乎忘记了,但是'fs.mkdir'会被'fs.watch'选中。这可能会产生额外的问题,您应该根据'event'参数进行过滤。 –

回答

1

好吧,所以我又多了几分钟,决定找一看。我重构了一些代码,但基本结构应该很容易识别。

 
var baseDir = './test', 
    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 
    // 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. 棒与同步fs方法上简单的脚本这样的工作时,在同步结束。虽然node.js以异步能力而闻名,但它有点过早的优化IMO。如果您需要将其嵌入到高性能网络服务器中,则可以在此时进行优化,而不是之前进行优化。

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

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

  4. 还有一些边缘情况下可能会崩溃。创建一个没有扩展名的文件,该扩展名将与您将基于另一个文件创建的目录具有相同的名称。 (文件不能成为目录,并且不能将文件移动到另一个文件中。)。如果您打算进入生产环境,那么您至少需要通过几次单元测试来强化代码。

干杯,

+0

你说“异步是不成熟的优化”。不仅如此,这是错误的原因。 –

+0

不成熟的优化是一个错误。 – dwerner

相关问题