node文件批量重命名

在一個實際需求中,須要對一批文件(如:文本、圖片)進行重命名,按照數字編號。正好藉此熟悉了一下node的fs文件操做,寫了一個批量修改文件名的腳本。javascript

原文連接java

需求

現有如下圖片文件
修改前node

須要批量修改文件名稱,變爲統一前綴名稱而且自增索引,修改後效果
修改後
最簡單的人力操做就是逐個文件重命名,但本着DRY(Don't repeat yourself)原則,仍是寫一個node腳本搞定。數組

研究

node中要進行文件操做須要瞭解一下fs模塊
在fs模塊中有同步和異步兩種方式瀏覽器

讀取文件

//異步
fs.readFile('test.txt', 'utf-8' (err, data) => {
    if (err) {
        throw err;
    }
    console.log(data);
});

//同步
let data = fs.readFileSync('test.txt');
console.log(data);

異步讀取文件參數:文件路徑,編碼方式,回調函數異步

寫入文件

fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
    if (err) {
        throw err;
    }
    console.log('saved');
});

寫入文件參數:目標文件,寫入內容,寫入形式,回調函數
flag寫入方式:函數

  • r:讀取文件
  • w:寫文件
  • a:追加

建立目錄

fs.mkdir('dir', (err) => {
    if (err) {
        throw err;
    }
    console.log('make dir success');
});

dir爲新建目錄名稱ui

讀取目錄

fs.readdir('dir',(err, files) => {
    if (err) {
        throw err;
    }
    console.log(files);
});

dir爲讀取目錄名稱,files爲目錄下的文件或目錄名稱數組this

獲取文件信息

fs.stat('test.txt', (err, stats)=> {
    console.log(stats.isFile());         //true
})

獲取文件信息後stats方法:編碼

方法 說明
stats.isFile() 是否爲文件
stats.isDirectory() 是否爲目錄
stats.isBlockDevice() 是否爲塊設備
stats.isCharacterDevice() 是否爲字符設備
stats.isSymbolicLink() 是否爲軟連接
stats.isFIFO() 是否爲UNIX FIFO命令管道
stats.isSocket() 是否爲Socket

建立讀取流

let stream = fs.createReadStream('test.txt');

建立寫入流

let stream = fs.createWriteStreamr('test_copy.txt');

開發

開發思路:

  • 讀取源目錄
  • 判讀存放目錄是否存在,不存在時新建目錄
  • 複製文件
  • 判斷複製內容是否爲文件
  • 建立讀取流
  • 建立寫入流
  • 連接管道,寫入文件內容

let fs = require('fs'),
    src = 'src',
    dist = 'dist',
    args = process.argv.slice(2),
    filename = 'image',
    index = 0;

//show help
if (args.length === 0 || args[0].match('--help')) {
    console.log('--help\n \t-src 文件源\n \t-dist 文件目標\n \t-n 文件名\n \t-i 文件名索引\n');
    return false;
}

args.forEach((item, i) => {
    if (item.match('-src')) {
        src = args[i + 1];
    } else if (item.match('-dist')) {
        dist = args[i + 1];
    } else if (item.match('-n')) {
        filename = args[i + 1];
    } else if (item.match('-i')) {
        index = args[i + 1];
    }
});

fs.readdir(src, (err, files) => {
    if (err) {
        console.log(err);
    } else {
        fs.exists(dist, exist => {
            if (exist) {
                copyFile(files, src, dist, filename, index);
            } else {
                fs.mkdir(dist, () => {
                    copyFile(files, src, dist, filename, index);
                })
            }
        });
    }
});

function copyFile(files, src, dist, filename, index) {
    files.forEach(n => {
        let readStream,
            writeStream,
            arr = n.split('.'),
            oldPath = src + '/' + n,
            newPath = dist + '/' + filename + index + '.' + arr[arr.length - 1];
        fs.stat(oldPath, (err, stats) => {
            if (err) {
                console.log(err);
            } else if (stats.isFile()) {
                readStream = fs.createReadStream(oldPath);
                writeStream = fs.createWriteStream(newPath);
                readStream.pipe(writeStream);
            }
        });
        index++;
    })
}

效果

總結

node提供了不少模塊能夠幫助咱們完成不一樣需求的功能開發,使javascript不單單侷限與瀏覽器中,嘗試本身編寫一些腳本有助於對這些模塊的理解,同時也能提升辦公效率。

相關文章
相關標籤/搜索