• Nodejs 学习笔记-相片整理Demo(二)


      好吧,开始代码!

      确认一下需要哪些模块,由于只需要进行文件复制,那么基本用fs和util就行了。那就先用这两个试试,不够再说。

      接下来需要定义一些要用到的变量,具体是什么,看注释吧。

     1 var fs = require('fs'),
     2     util = require('util'),
     3     fromPath = 'G:\相片备份\相片\日常', //基础目录
     4     toPath = 'L:\相片备份\相片\日常',//备份目录
     5     copy = {}, //命名空间
     6     fileCount = 0, //总数
     7     dirCount = 0,  //文件夹数量
     8     startTime,     //开始时间
     9     copyFormat = ['png', 'jpg', 'gif', 'tif', '3gp', 'mpg', 'thm', 'mov', 'mp4', 'vob', 'ifo', 'bup', 'avi', 'bmp', 'zip', 'rar'],//复制的格式
    10     pathSpliter = '\', //路径分隔符
    11     totalCount = 0, //总数
    12     copyCount = 0,  //复制数量
    13     uncopyCount = 0;//没有复制的数量
    View Code

      定义好变量和引用的模块,下面开始写功能函数。

      1.要检测一下两个路径是否存在,如果要复制到的路径不存在,就要创建一下。

     1 //检测路径
     2 copy.checkPath = function (path, callback) {
     3     fs.exists(path,
     4         function (exist) {
     5             if (exist) {
     6                 console.log('路径存在!-' + path);
     7             } else {
     8                 console.log('路径不存在!-' + path);
     9             }
    10             if (callback) {
    11                 callback(exist);
    12             }
    13         });
    14 };
    15 //检测源路径
    16 copy.checkFromPath = function () {
    17     startTime = new Date();
    18     copy.checkPath(fromPath,
    19         function (exist) {
    20             if (exist) {
    21                 copy.checkToPath();
    22             } else {
    23                 console.log('复制路径不存在,检查一下。');
    24             }
    25         });
    26 };
    27 //创建路径
    28 copy.createPath = function (path, callback) {
    29     fs.mkdir(path, '0777',
    30         function (err, result) {
    31             //console.log('创建路径-' +    path);
    32             callback();
    33         });
    34 };
    35 //复制路径
    36 copy.checkToPath = function () {
    37     copy.checkPath(toPath,
    38         function (exist) {
    39             if (exist) {
    40                 copy.readPath(fromPath, copy.fs);
    41             } else {
    42                 copy.createPath(toPath,
    43                     function () {
    44                         copy.readPath(fromPath, copy.fs);
    45                     });
    46             }
    47         });
    48 };
    View Code

      2.路径准备完毕了,需要开始了解一下都有哪些文件需要复制了,然后根据规则逐条复制吧。

      1 //数据文件系统
      2 copy.fs = {};
      3 copy.readPath = function (path, fss) {
      4     fs.readdir(path,
      5         function (err, files) {
      6             if (err) console.log(err);
      7             else {
      8                 dirCount++;
      9                 copy.fillFilesTofs(path, files, fss);
     10             }
     11         });
     12 };
     13 //填充文件夹结构
     14 copy.fillFilesTofs = function (path, files, fss) {
     15     fss['path'] = path;
     16     fss['children'] = files;
     17     copy.copyFiles(fss);
     18 };
     19 copy.getPathByTime = function (date, format) {
     20     var result = {
     21         path: '',
     22         filename: ''
     23     };
     24     var paths = [];
     25     paths.push(toPath);
     26     paths.push(date.getFullYear());
     27     var month = date.getMonth() + 1;
     28     month = month.toString();
     29     if (month.length == 1) {
     30         month = '0' + month;
     31 
     32     }
     33     paths.push(month);
     34     var day = date.getDate();
     35     day = day.toString();
     36     if (day.length == 1) {
     37         day = '0' + day;
     38 
     39     }
     40     paths.push(day);
     41     //paths.push(date.getTime()    + '.' +    format);
     42     var hour = date.getHours();
     43     hour = hour.toString();
     44     if (hour.length == 1) {
     45         hour = '0' + hour;
     46 
     47     }
     48     var minutes = date.getMinutes();
     49     minutes = minutes.toString();
     50     if (minutes.length == 1) {
     51         minutes = '0' + minutes;
     52 
     53     }
     54     var seconds = date.getSeconds();
     55     seconds = seconds.toString();
     56     if (seconds.length == 1) {
     57         seconds = '0' + seconds;
     58 
     59     }
     60     return {
     61         path: paths.join(pathSpliter),
     62         filename: hour + minutes + seconds + '.' + format
     63     };
     64 
     65 };
     66 //复制文件夹目录
     67 copy.copyFiles = function (fss) {
     68     if (fss.children.length > 0) {
     69         var fullpath = fss.path + pathSpliter + fss.children[0];
     70         fs.stat(fullpath,
     71             function (err, stat) {
     72                 if (err) throw err;
     73                 else {
     74                     if (stat.isFile()) {
     75                         var format = fss.children[0].split('.');
     76                         format = format[format.length - 1];
     77                         if (format && copyFormat.indexOf(format.toString().toLowerCase()) >= 0) {
     78                             format = format.toString().toLowerCase();
     79                             var cTime = stat.mtime;
     80                             var newPath = copy.getPathByTime(cTime, format);
     81                             var cp = function () {
     82                                 copy.copyFile(fullpath, newPath.path + pathSpliter + newPath.filename, stat,
     83                                     function () {
     84                                         fss.children.shift();
     85                                         copy.copyFiles(fss);
     86                                     });
     87                             };
     88                             fs.exists(newPath.path,
     89                                 function (exist) {
     90                                     if (exist) {
     91                                         cp();
     92                                     }
     93                                     else {
     94                                         copy.mkdir(newPath.path, 2,
     95                                             function () {
     96                                                 cp();
     97                                             });
     98                                     }
     99                                 });
    100                         } else {
    101                             console.log('没有复制文件-' + fullpath);
    102                             console.log(format.toString().toLowerCase());
    103                             fss.children.shift();
    104                             copy.copyFiles(fss);
    105                         }
    106                     } else {
    107                         fss.children[0] = {
    108                             'path': fullpath,
    109                             'children': [],
    110                             'parentPath': fss.path
    111                         };
    112                         copy.readPath(fullpath, fss.children[0]);
    113                     }
    114                     ;
    115                 }
    116             });
    117 
    118     } else {
    119         if (fss.parentPath) {
    120             var parent = copy.getParent(fss.parentPath, copy.fs, 0);
    121             if (parent) {
    122                 parent.children.shift();
    123                 copy.copyFiles(parent);
    124             }
    125         }
    126         ;
    127     }
    128 
    129 };
    130 //创建文件夹
    131 copy.mkdir = function (path, deep, callback) {
    132     var paths = path.split(pathSpliter);
    133     var p = [];
    134     if (deep == paths.length + 1) {
    135         callback();
    136     } else {
    137         for (var i = 0; i < deep; i++) {
    138             p.push(paths[i]);
    139         }
    140         fs.exists(p.join(pathSpliter),
    141             function (exist) {
    142                 if (exist) {
    143                     copy.mkdir(path, deep + 1, callback);
    144                 } else {
    145                     fs.mkdir(p.join(pathSpliter), '0777',
    146                         function () {
    147                             copy.mkdir(path, deep + 1, callback);
    148 
    149                         });
    150                 }
    151             });
    152     }
    153 };
    154 //复制文件
    155 copy.copyFile = function (fPath, tPath, fStat, callback) {
    156     fs.exists(tPath,
    157         function (exist) {
    158             if (exist) {
    159                 fs.stat(tPath,
    160                     function (err, stat) {
    161                         if (err) throw err;
    162                         if (stat.ct == fStat.ct && stat.size == fStat.size) {
    163                             callback();
    164                         } else {
    165                             var nTpath = tPath.split('.')[0] + '0.' + tPath.split('.')[1];
    166                             copy.copyFile(fPath, nTpath, fStat, callback);
    167 
    168                         }
    169                     });
    170             } else {
    171                 var readStream = fs.createReadStream(fPath);
    172                 var writeStream = fs.createWriteStream(tPath);
    173                 console.log('copyFile-' + fPath + '-' + tPath + exist);
    174 
    175                 util.pump(readStream, writeStream,
    176                     function () {
    177                         fileCount++;
    178                         callback();
    179                     });
    180 
    181             }
    182 
    183         });
    184 };
    185 //获取父节点
    186 copy.getParent = function (path, fss, deep) {
    187     if (fss.path == path) {
    188         return fss;
    189     } else {
    190         for (var i = 0; i < fss.children.length; i++) {
    191             var p = copy.getParent(path, fss.children[i], deep++);
    192             if (p) {
    193                 return p;
    194             }
    195         }
    196         return null;
    197     }
    198 };
    View Code
  • 相关阅读:
    【题解】Luogu CF817F MEX Queries
    【题解】Luogu P4396 [AHOI2013]作业
    【题解】Luogu P4198 楼房重建
    【题解】Luogu P1471 方差
    【题解】Luogu P4069 [SDOI2016]游戏
    【题解】Luogu P4097 [HEOI2013]Segment
    李超线段树略解
    【题解】JSOIWC2019 Round 5
    【题解】Luogu P2763 试题库问题
    【题解】JSOIWC2019 Round4
  • 原文地址:https://www.cnblogs.com/yuxichina/p/3247441.html
Copyright © 2020-2023  润新知