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 filesconsole.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 changesconsole.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 filesconsole.log("removed:",f);})});
async function upload(){console.log('start to upload');//https://www.npmjs.com/package/basic-ftpconst 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 fileconsole.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.phpvar 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.phpvar remote_file=local_file.replace(__dirname.replace(/\\/g,'/'),'').substr(1);//dirawait client.ensureDir(config.remote_root+remote_path);//change dirawait client.cd(config.remote_root+remote_path);//uploadawait 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 filesconsole.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 changesconsole.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 filesconsole.log("removed:",f);})});
function create_dir_cmd(remote_root,remote_path){// a/b/cif(!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.phpvar 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.phpvar 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);//mkdirson+="cd "+config.remote_root+remote_path+"\n";//change dirson+="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
转载于:https://www.cnblogs.com/songzhenghe/p/9469493.html
nodejs 监控代码变动实现ftp上传相关推荐
- java ftp 上传文件 进度条_java FTP上传文件(进度条显示进度)
java实现FTP上传有2种方式,一种是org.apache.commons.net.ftp.FTPClient这个jar包,一种是sun.net.ftp.FtpClient.不知道为什么,在使用前一 ...
- php获取svn文件,然后ftp上传服务器代码
配置文件 <?php //setup commandline $svn_cmd1 = 'svn.exe update '; $svn_cmd2 = ' --username xxx --pass ...
- asp.net实现ftp上传代码(解决大文件上传问题)
asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...
- java ftp上传文件相关代码梳理
java实现ftp文件上传 1.ftp文件上传步骤 1)连接ftp 2)检查工作目录是否存在 3)检查是否上传成功 4)完成任务后,断开ftp 2.具体如下,直接贴上核心代码: A)导入核心pom依赖 ...
- nodejs连接ftp上传下载
依赖 //ftp 模块是目前找到的还不错的,对于ftp的基本功能都支持 npm install ftp 连接ftp const ftp = require('ftp');//连接FTP const c ...
- java ftp 上传文件到服务器,java实现ftp上传文件到服务器
java实现ftp上传文件到服务器 内容精选 换一换 怎样上传文件到Windows操作系统云服务器?安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ ...
- ftp 文件夹 上传到服务器,ftp上传文件夹到服务器 远程路径
ftp上传文件夹到服务器 远程路径 内容精选 换一换 WinSCP工具可以实现在本地与远程计算机之间安全地复制文件.与使用FTP上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器, ...
- jsp向服务器上传文件,jsp ftp 上传文件到服务器
jsp ftp 上传文件到服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分 ...
- 用ftp上传到服务器视频文件夹,ftp 上传文件夹到服务器
ftp 上传文件夹到服务器 内容精选 换一换 上传的文件和上传的文件夹中包含的文件支持的格式请参见支持的文件格式.文件上传:从本地上传:在Projects Explorer视图中选中一个文件夹,依次单 ...
最新文章
- QT中无法使用10^n次方来计算
- 别光看世界杯 7月还有一场音视频技术盛宴等着你
- 使用独立主机时需要关注的问题
- 关于 SAP Spartacus 的 Theme 颜色主题
- C语言高级技术之--游戏属性修改器(背景故事)
- 硬盘分区与故障排解速查手册(1)
- mysql 转换编码
- PyQt5入门——删除、清空layout布局中的所有对象(含常见问题详解)
- VS+VSS代码管理
- linux CentOS 7中firewall防火墙详解和配置以及切换为iptables防火墙
- 电子科大+矩阵理论+总复习知识点总结
- 人工智能--符号计算--笔记
- 有趣的设计模式——两脚插头也能使用三孔插板
- 网络安全——ARP欺骗与突破封锁
- Fedora系统之打开终端快捷键设置
- 原win7系统迁移到SSD固态硬盘
- 信息服务器v6,服务器ipv6设置
- 骑士cms火车头发布模块-骑士cms火车头采集规则免费
- ubuntu18.04程序开机自启动
- Linux中静态库和动态库(共享库)的区别