javascript - node fs重命名问题
高洛峰
高洛峰 2017-04-11 11:51:56
[JavaScript讨论组]

需求 : 对一个文件夹中的所有jpg文件重命名为 1.jpg 、2.jpg、3.jpg、...依次类推;

问题1:使用node的fs模块代码如下:

var fs = require('fs');
var counter = 1;
var re = /(.*)+\.(jpg|bmp|gif|png)$/i;

fs.readdir('./', function(err, files) {
    if (err) {
        console.log("失败了");
    } else {
        for (var index = 0; index < files.length; index++) {
            var element = files[index];
            if (re.test(element)) {
                fs.rename(element,counter + '.jpg', function(err, fil) {
                    if (err) {
                        console.log(counter + '命名失败');
                    } else {
                        // console.log(files);
                        console.log(counter + '命名成功');
                        counter++;
                    }
                })
            }

        }
    }
})

运行前:
运行后:
请问: 为什么会只剩下1.jpg? 问题出在哪里?

问题2: 你知道的几种方法可以做到这样的重命名? shell 、 正则replace、python等等皆可, 望给出代码实例;

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
巴扎黑

fs.rename 是异步的,所以就没法保证counter的值是按顺序累加的,推荐以下写法(在Windows上测试过).

fs.readdir('./', function(err, files) {
    if (err) {
        console.log("失败了");
        return;  //如果出错直接返回,就不用else了
    }
    files.forEach(function(fn){ //这样更简便
        if(!re.test(fn)) return;
        console.log(">>> "+ fn);
        fs.renameSync(fn,counter + '.jpg' ); //同步重命名
        counter++;
    });   
});
伊谢尔伦

没有运行过代码,不过应该是counter++的问题,首先尝试将counter++放到fs.rename后面,应该可以通过。推测原因是fs.rename是异步代码,所以并不会等待fs.rename执行完成后执行counter++

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号