被动模式下

  1. //https://www.npmjs.com/package/watch
  2. //文件同步功能
  3. var watch = require('watch');
  4. var path = require("path");
  5. var fs = require('fs');
  6. var http = require('http');
  7. const ftp = require("basic-ftp");
  8. var files=[];
  9. var config={
  10. //remote_root:'/Users/apple/kefu/',
  11. // host:'192.168.1.159',
  12. // username:'apple',
  13. // password:'123',
  14. remote_root:'/',
  15. host:'127.0.0.1',
  16. username:'aaaa',
  17. password:'aaaa',
  18. };
  19. //需要忽略的文件或目录
  20. var ignore=[
  21. __dirname+'\\file',
  22. ];
  23.  
  24. function readDirSync(path){
  25. var files=[];
  26. var pa = fs.readdirSync(path);
  27. pa.forEach(function(ele,index){
  28. var info = fs.statSync(path+"/"+ele);
  29. if(info.isDirectory()){
  30. files=files.concat(readDirSync(path+"/"+ele));
  31. }else{
  32. files.push(path+"/"+ele);
  33. }
  34. })
  35. return files;
  36. }
  37.  
  38. console.log('start watching');
  39. watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
  40. monitor.on("created", function (f, stat) {
  41. for(var i=0;i<ignore.length;i++){
  42. if(f.indexOf(ignore[i])>=0) return;
  43. }
  44. // Handle new files
  45. console.log("created:",f);
  46. var stats=fs.statSync(f);
  47. if(stats.isDirectory()){
  48. var folder_files=readDirSync(f);
  49. for(var i=0;i<folder_files.length;i++){
  50. console.log("created:",folder_files[i]);
  51. if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
  52. }
  53. }else if(stats.isFile()){
  54. if(files.indexOf(f)===-1) files.push(f);
  55. }
  56. })
  57. monitor.on("changed", function (f, curr, prev) {
  58. for(var i=0;i<ignore.length;i++){
  59. if(f.indexOf(ignore[i])>=0) return;
  60. }
  61. // Handle file changes
  62. console.log("changed:",f);
  63. if(files.indexOf(f)===-1) files.push(f);
  64. })
  65. monitor.on("removed", function (f, stat) {
  66. for(var i=0;i<ignore.length;i++){
  67. if(f.indexOf(ignore[i])>=0) return;
  68. }
  69. // Handle removed files
  70. console.log("removed:",f);
  71.  
  72. })
  73.  
  74. });
  75. async function upload(){
  76.  
  77. console.log('start to upload');
  78. //https://www.npmjs.com/package/basic-ftp
  79. const client = new ftp.Client();
  80. client.ftp.verbose = true;
  81. try {
  82. await client.connect(config.host, 21);
  83. // await client.useTLS();
  84. await client.login(config.username, config.password);
  85. await client.useDefaultSettings();
  86. //await client.upload(fs.createReadStream("README.md"), "README.md");
  87.  
  88. //上传目录 避免中文
  89. //console.log(await client.list());
  90.  
  91. //read file
  92. console.log('begin to upload');
  93. if(!files.length){
  94. console.log('no files to upload');
  95. return;
  96. }
  97. var contents=files;
  98.  
  99. for(var i=0;i<contents.length;i++){
  100. var roots=contents[i].trim();
  101. if(!roots) continue;
  102. if(!fs.existsSync(roots)) continue;
  103. roots=roots.replace(/\\/g,'/');
  104. //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
  105. var local_file=roots;
  106. var local_path=path.dirname(local_file);
  107. var remote_path=local_path.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
  108. //Users/apple/kefu/application/models/0/usersModel.class.php
  109. var remote_file=local_file.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
  110. //dir
  111. await client.ensureDir(config.remote_root+remote_path);
  112. //change dir
  113. await client.cd(config.remote_root+remote_path);
  114. //upload
  115. await client.upload(fs.createReadStream(local_file), path.basename(local_file));
  116.  
  117. }
  118. files=[];
  119. console.log('upload finished!');
  120.  
  121. }
  122. catch(err) {
  123. console.log(err);
  124. }
  125. client.close();
  126.  
  127. }
  128. var x=0;
  129. //http://nodejs.cn//api/process.html#process_signal_events
  130. process.stdin.resume();
  131.  
  132. process.on('SIGINT', () => {
  133. // x++;
  134. // if(x==2){
  135. // console.log('byebye');
  136. // process.exit(0);
  137. // }
  138. upload();
  139.  
  140. });

  主动模式下

  1. //https://www.npmjs.com/package/watch
  2. //https://blog.csdn.net/zgljl2012/article/details/50365492
  3. //文件同步功能
  4. var watch = require('watch');
  5. var path = require("path");
  6. var fs = require('fs');
  7. var p = require('child_process');
  8. var iconv = require("iconv-lite");
  9. var files=[];
  10.  
  11. var config={
  12. //remote_root:'/Users/apple/kefu/',
  13. // host:'192.168.1.159',
  14. // username:'apple',
  15. // password:'123',
  16. remote_root:'/',
  17. host:'127.0.0.1',
  18. username:'',
  19. password:'',
  20. };
  21.  
  22. //需要忽略的文件或目录
  23. var ignore=[
  24. __dirname+'\\file',
  25. __dirname+'\\cmd.txt',
  26. ];
  27.  
  28. function readDirSync(path){
  29. var files=[];
  30. var pa = fs.readdirSync(path);
  31. pa.forEach(function(ele,index){
  32. var info = fs.statSync(path+"/"+ele);
  33. if(info.isDirectory()){
  34. files=files.concat(readDirSync(path+"/"+ele));
  35. }else{
  36. files.push(path+"/"+ele);
  37. }
  38. })
  39. return files;
  40. }
  41.  
  42. console.log('start watching');
  43. watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
  44. monitor.on("created", function (f, stat) {
  45. for(var i=0;i<ignore.length;i++){
  46. if(f.indexOf(ignore[i])>=0) return;
  47. }
  48. // Handle new files
  49. console.log("created:",f);
  50. var stats=fs.statSync(f);
  51. if(stats.isDirectory()){
  52. var folder_files=readDirSync(f);
  53. for(var i=0;i<folder_files.length;i++){
  54. console.log("created:",folder_files[i]);
  55. if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
  56. }
  57. }else if(stats.isFile()){
  58. if(files.indexOf(f)===-1) files.push(f);
  59. }
  60. })
  61. monitor.on("changed", function (f, curr, prev) {
  62. for(var i=0;i<ignore.length;i++){
  63. if(f.indexOf(ignore[i])>=0) return;
  64. }
  65. // Handle file changes
  66. console.log("changed:",f);
  67. if(files.indexOf(f)===-1) files.push(f);
  68. })
  69. monitor.on("removed", function (f, stat) {
  70. for(var i=0;i<ignore.length;i++){
  71. if(f.indexOf(ignore[i])>=0) return;
  72. }
  73. // Handle removed files
  74. console.log("removed:",f);
  75.  
  76. })
  77.  
  78. });
  79. function create_dir_cmd(remote_root,remote_path){
  80. // a/b/c
  81. if(!remote_path) return '';
  82. var folder=remote_path.split('/');
  83. var cmd='';
  84. var base=remote_root;
  85. for(let i=0;i<folder.length;i++){
  86. if(!folder[i]) continue;
  87. base+=folder[i]+'/';
  88. cmd+="mkdir "+base+"\n";
  89. }
  90. return cmd;
  91. }
  92. function upload(){
  93.  
  94. console.log('begin to upload');
  95. if(!files.length){
  96. console.log('no files to upload');
  97. return;
  98. }
  99.  
  100. var son='';
  101.  
  102. var contents=files;
  103. for(var i=0;i<contents.length;i++){
  104. var roots=contents[i].trim();
  105. if(!roots) continue;
  106. if(!fs.existsSync(roots)) continue;
  107. roots=roots.replace(/\\/g,'/');
  108. //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
  109. var local_file=roots;
  110. var local_path=path.dirname(local_file);
  111. var remote_path=local_path.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
  112. //Users/apple/kefu/application/models/0/usersModel.class.php
  113. var remote_file=local_file.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
  114. //dir
  115. //await client.ensureDir(config.remote_root+remote_path);
  116. //change dir
  117. //await client.cd(config.remote_root+remote_path);
  118. //upload
  119. //await client.upload(fs.createReadStream(local_file), path.basename(local_file));
  120. son+=create_dir_cmd(config.remote_root,remote_path);//mkdir
  121. son+="cd "+config.remote_root+remote_path+"\n";//change dir
  122. son+="put \""+local_file+"\" \""+path.basename(local_file)+"\"\n";//upload
  123. }
  124.  
  125. var str=`open ${config.host}
  126. ${config.username}
  127. ${config.password}
  128. binary
  129. prompt off
  130. pwd
  131. ${son}
  132. close
  133. quit
  134. `;
  135.  
  136. var flag=fs.writeFile('cmd.txt', str,(err) => {
  137. if (err) throw err;
  138. console.log('cmd.txt保存成功!');
  139.  
  140. p.exec('ftp -s:cmd.txt', { encoding: 'binary' },function (error, stdout, stderr) {
  141. if (error !== null) {
  142. console.log('exec error: ' + error);
  143. }
  144. console.log(iconv.decode(Buffer.from(stdout, 'binary'), 'cp936'));
  145.  
  146. files=[];
  147. console.log('upload finished!');
  148. });
  149.  
  150. });
  151.  
  152. }
  153.  
  154. var x=0;
  155. //http://nodejs.cn//api/process.html#process_signal_events
  156. process.stdin.resume();
  157.  
  158. process.on('SIGINT', () => {
  159. // x++;
  160. // if(x==2){
  161. // console.log('byebye');
  162. // process.exit(0);
  163. // }
  164. upload();
  165.  
  166. });

  建议使用第二种,使用的是windows的ftp命令,兼容了主动模式

watch.bat

  1. node watch.js
  2. pause

  使用时双击watch.bat

需要上传时按ctrl+c

nodejs 监控代码变动实现ftp上传的更多相关文章

  1. python 网络编程粘包解决方案2 + ftp上传 + socketserver

    一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...

  2. ftp上传java代码

    <欢迎转载http://www.cnblogs.com/shizhongtao/p/3345826.html> 上传代码就写个简单的小例子.首先要加入jar包.commons-net-1. ...

  3. C# FTP上传文件至服务器代码

    C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...

  4. python之实现ftp上传下载代码(含错误处理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...

  5. python之模块ftplib(实现ftp上传下载代码)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...

  6. 超实用文件监控多线程FTP上传工具

    这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...

  7. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  8. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  9. FTP上传文件提示550错误原因分析。

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

随机推荐

  1. 【转】Linux 高级的视角来查看Linux引导过程

    [原文]https://www.toutiao.com/i6594210975480545800/ 1.概述 图 1 是我们在20,000 英尺的高度看到的视图. 当系统首次引导时,或系统被重置时,处 ...

  2. 解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务

    1.mysql 连不上,只要将mysql重新加为windows服务即可.(我的是mysql-5.6.24-winx64 解压版)    方法:mysqld --install mysql --defa ...

  3. 打开word文档时提示“Microsoft Office Word已停止工作”

    我的电脑(Win10)有Office 2003和2013两个版本,可能由于之前超长待机等原因导致word 2003的文件(.doc)不能正常打开,没次都会提示“Microsoft Office Wor ...

  4. 线程同步方式之互斥量Mutex

    互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的. 互斥量相对于临界区更为高级,可以对互 ...

  5. 2-5 R语言基础 factor

    #因子:分类数据#有序和无序#整数向量+标签label#Male/Female#常用于lm(),glm() > x <- factor(c("female"," ...

  6. 《Linux大棚命令百篇下》网络篇的总结

    本文是<Linux大棚命令百篇下>网络篇的总结 ping -c 指定数量,在windows下会自动停止,linux下会一直ping下去 -q 简短报告 -s 指定每次ping的数据包大小, ...

  7. 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案

    阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...

  8. apache不能启动LoadModule php5_module modules/ph

    apache不能启动LoadModule php5_module modules/php5apache2.dll的问题 主要是版本问题!!有点不爽!! apache不能启动 加入下面两行,apache ...

  9. str操作方法

    s = 'dsj,fhk,je,f' # s1 = s.split(',') # print(s1) s = 'aleX leNb' s1 = s.strip() print(s1) s2 = s[2 ...

  10. MetaMask/Website

    https://github.com/MetaMask/Website 将这个包下载下来之后运行npm install出现下面的问题 gyp: No Xcode or CLT version dete ...