nodejs 监控代码变动实现ftp上传
被动模式下
- //https://www.npmjs.com/package/watch
- //文件同步功能
- var watch = require('watch');
- var path = require("path");
- var fs = require('fs');
- var http = require('http');
- const ftp = require("basic-ftp");
- var files=[];
- var config={
- //remote_root:'/Users/apple/kefu/',
- // host:'192.168.1.159',
- // username:'apple',
- // password:'123',
- remote_root:'/',
- host:'127.0.0.1',
- username:'aaaa',
- password:'aaaa',
- };
- //需要忽略的文件或目录
- var ignore=[
- __dirname+'\\file',
- ];
- function readDirSync(path){
- var files=[];
- var pa = fs.readdirSync(path);
- pa.forEach(function(ele,index){
- var info = fs.statSync(path+"/"+ele);
- if(info.isDirectory()){
- files=files.concat(readDirSync(path+"/"+ele));
- }else{
- files.push(path+"/"+ele);
- }
- })
- return files;
- }
- console.log('start watching');
- watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
- monitor.on("created", function (f, stat) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle new files
- console.log("created:",f);
- var stats=fs.statSync(f);
- if(stats.isDirectory()){
- var folder_files=readDirSync(f);
- for(var i=0;i<folder_files.length;i++){
- console.log("created:",folder_files[i]);
- if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
- }
- }else if(stats.isFile()){
- if(files.indexOf(f)===-1) files.push(f);
- }
- })
- monitor.on("changed", function (f, curr, prev) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle file changes
- console.log("changed:",f);
- if(files.indexOf(f)===-1) files.push(f);
- })
- monitor.on("removed", function (f, stat) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle removed files
- console.log("removed:",f);
- })
- });
- async function upload(){
- console.log('start to upload');
- //https://www.npmjs.com/package/basic-ftp
- const client = new ftp.Client();
- client.ftp.verbose = true;
- try {
- await client.connect(config.host, 21);
- // await client.useTLS();
- await client.login(config.username, config.password);
- await client.useDefaultSettings();
- //await client.upload(fs.createReadStream("README.md"), "README.md");
- //上传目录 避免中文
- //console.log(await client.list());
- //read file
- console.log('begin to upload');
- if(!files.length){
- console.log('no files to upload');
- return;
- }
- var contents=files;
- for(var i=0;i<contents.length;i++){
- var roots=contents[i].trim();
- if(!roots) continue;
- if(!fs.existsSync(roots)) continue;
- roots=roots.replace(/\\/g,'/');
- //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
- var local_file=roots;
- var local_path=path.dirname(local_file);
- var remote_path=local_path.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
- //Users/apple/kefu/application/models/0/usersModel.class.php
- var remote_file=local_file.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
- //dir
- await client.ensureDir(config.remote_root+remote_path);
- //change dir
- await client.cd(config.remote_root+remote_path);
- //upload
- await client.upload(fs.createReadStream(local_file), path.basename(local_file));
- }
- files=[];
- console.log('upload finished!');
- }
- catch(err) {
- console.log(err);
- }
- client.close();
- }
- var x=0;
- //http://nodejs.cn//api/process.html#process_signal_events
- process.stdin.resume();
- process.on('SIGINT', () => {
- // x++;
- // if(x==2){
- // console.log('byebye');
- // process.exit(0);
- // }
- upload();
- });
主动模式下
- //https://www.npmjs.com/package/watch
- //https://blog.csdn.net/zgljl2012/article/details/50365492
- //文件同步功能
- var watch = require('watch');
- var path = require("path");
- var fs = require('fs');
- var p = require('child_process');
- var iconv = require("iconv-lite");
- var files=[];
- var config={
- //remote_root:'/Users/apple/kefu/',
- // host:'192.168.1.159',
- // username:'apple',
- // password:'123',
- remote_root:'/',
- host:'127.0.0.1',
- username:'',
- password:'',
- };
- //需要忽略的文件或目录
- var ignore=[
- __dirname+'\\file',
- __dirname+'\\cmd.txt',
- ];
- function readDirSync(path){
- var files=[];
- var pa = fs.readdirSync(path);
- pa.forEach(function(ele,index){
- var info = fs.statSync(path+"/"+ele);
- if(info.isDirectory()){
- files=files.concat(readDirSync(path+"/"+ele));
- }else{
- files.push(path+"/"+ele);
- }
- })
- return files;
- }
- console.log('start watching');
- watch.createMonitor(__dirname,{ignoreDotFiles:true}, function (monitor) {
- monitor.on("created", function (f, stat) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle new files
- console.log("created:",f);
- var stats=fs.statSync(f);
- if(stats.isDirectory()){
- var folder_files=readDirSync(f);
- for(var i=0;i<folder_files.length;i++){
- console.log("created:",folder_files[i]);
- if(files.indexOf(folder_files[i])===-1) files.push(folder_files[i]);
- }
- }else if(stats.isFile()){
- if(files.indexOf(f)===-1) files.push(f);
- }
- })
- monitor.on("changed", function (f, curr, prev) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle file changes
- console.log("changed:",f);
- if(files.indexOf(f)===-1) files.push(f);
- })
- monitor.on("removed", function (f, stat) {
- for(var i=0;i<ignore.length;i++){
- if(f.indexOf(ignore[i])>=0) return;
- }
- // Handle removed files
- console.log("removed:",f);
- })
- });
- function create_dir_cmd(remote_root,remote_path){
- // a/b/c
- if(!remote_path) return '';
- var folder=remote_path.split('/');
- var cmd='';
- var base=remote_root;
- for(let i=0;i<folder.length;i++){
- if(!folder[i]) continue;
- base+=folder[i]+'/';
- cmd+="mkdir "+base+"\n";
- }
- return cmd;
- }
- function upload(){
- console.log('begin to upload');
- if(!files.length){
- console.log('no files to upload');
- return;
- }
- var son='';
- var contents=files;
- for(var i=0;i<contents.length;i++){
- var roots=contents[i].trim();
- if(!roots) continue;
- if(!fs.existsSync(roots)) continue;
- roots=roots.replace(/\\/g,'/');
- //E:/wwwroot2/kefuv3/application/models/0/usersModel.class.php
- var local_file=roots;
- var local_path=path.dirname(local_file);
- var remote_path=local_path.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
- //Users/apple/kefu/application/models/0/usersModel.class.php
- var remote_file=local_file.replace(__dirname.replace(/\\/g,'/'),'').substr(1);
- //dir
- //await client.ensureDir(config.remote_root+remote_path);
- //change dir
- //await client.cd(config.remote_root+remote_path);
- //upload
- //await client.upload(fs.createReadStream(local_file), path.basename(local_file));
- son+=create_dir_cmd(config.remote_root,remote_path);//mkdir
- son+="cd "+config.remote_root+remote_path+"\n";//change dir
- son+="put \""+local_file+"\" \""+path.basename(local_file)+"\"\n";//upload
- }
- var str=`open ${config.host}
- ${config.username}
- ${config.password}
- binary
- prompt off
- pwd
- ${son}
- close
- quit
- `;
- var flag=fs.writeFile('cmd.txt', str,(err) => {
- if (err) throw err;
- console.log('cmd.txt保存成功!');
- p.exec('ftp -s:cmd.txt', { encoding: 'binary' },function (error, stdout, stderr) {
- if (error !== null) {
- console.log('exec error: ' + error);
- }
- console.log(iconv.decode(Buffer.from(stdout, 'binary'), 'cp936'));
- files=[];
- console.log('upload finished!');
- });
- });
- }
- var x=0;
- //http://nodejs.cn//api/process.html#process_signal_events
- process.stdin.resume();
- process.on('SIGINT', () => {
- // x++;
- // if(x==2){
- // console.log('byebye');
- // process.exit(0);
- // }
- upload();
- });
建议使用第二种,使用的是windows的ftp命令,兼容了主动模式
watch.bat
- node watch.js
- pause
使用时双击watch.bat
需要上传时按ctrl+c
nodejs 监控代码变动实现ftp上传的更多相关文章
- python 网络编程粘包解决方案2 + ftp上传 + socketserver
一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...
- ftp上传java代码
<欢迎转载http://www.cnblogs.com/shizhongtao/p/3345826.html> 上传代码就写个简单的小例子.首先要加入jar包.commons-net-1. ...
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
- python之实现ftp上传下载代码(含错误处理)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kait ...
- python之模块ftplib(实现ftp上传下载代码)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...
- 超实用文件监控多线程FTP上传工具
这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
随机推荐
- 【转】Linux 高级的视角来查看Linux引导过程
[原文]https://www.toutiao.com/i6594210975480545800/ 1.概述 图 1 是我们在20,000 英尺的高度看到的视图. 当系统首次引导时,或系统被重置时,处 ...
- 解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务
1.mysql 连不上,只要将mysql重新加为windows服务即可.(我的是mysql-5.6.24-winx64 解压版) 方法:mysqld --install mysql --defa ...
- 打开word文档时提示“Microsoft Office Word已停止工作”
我的电脑(Win10)有Office 2003和2013两个版本,可能由于之前超长待机等原因导致word 2003的文件(.doc)不能正常打开,没次都会提示“Microsoft Office Wor ...
- 线程同步方式之互斥量Mutex
互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的. 互斥量相对于临界区更为高级,可以对互 ...
- 2-5 R语言基础 factor
#因子:分类数据#有序和无序#整数向量+标签label#Male/Female#常用于lm(),glm() > x <- factor(c("female"," ...
- 《Linux大棚命令百篇下》网络篇的总结
本文是<Linux大棚命令百篇下>网络篇的总结 ping -c 指定数量,在windows下会自动停止,linux下会一直ping下去 -q 简短报告 -s 指定每次ping的数据包大小, ...
- 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案
阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...
- apache不能启动LoadModule php5_module modules/ph
apache不能启动LoadModule php5_module modules/php5apache2.dll的问题 主要是版本问题!!有点不爽!! apache不能启动 加入下面两行,apache ...
- str操作方法
s = 'dsj,fhk,je,f' # s1 = s.split(',') # print(s1) s = 'aleX leNb' s1 = s.strip() print(s1) s2 = s[2 ...
- MetaMask/Website
https://github.com/MetaMask/Website 将这个包下载下来之后运行npm install出现下面的问题 gyp: No Xcode or CLT version dete ...