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) 文 ...
随机推荐
- C# post json 匿名类 序列化
//第一步 建立HTTP请求对象 var httpWebRequest = (HttpWebRequest)WebRequest.Create(apiURL); httpWebRequest.Cont ...
- Spark 集群管理命令
[启动] # 启动所有服务 start-all.sh # 启动 master start-master.sh # 启动所有 worker start-slaves.sh # 启动单个 worker s ...
- CentOS7中部署Showdoc
目录 CentOS7中部署Showdoc 前置环境 部署 配置文件 解压安装包 添加启动服务 设置权限 运行安装 界面 CentOS7中部署Showdoc 文:铁乐与猫 前置环境 因为showdoc其 ...
- ELK 安装过程补充(不建议看,很少)
1.yum 安装ELK服务 参考文档:https://blog.csdn.net/tonghudan/article/details/81414387 rpm -Uvh https://dl.fedo ...
- DAU、UV、独立IP、PV的区别和联系
基本概念 DAU(Daily Active User)日活跃用户数量.常用于反映网站.互联网应用或网络游戏的运营情况.DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户 ...
- django复习-3-请求与响应
一.请求request 前端向后端传递参数有几种方式? 提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取: "http://127. ...
- Vuex数据页面刷新丢失问题解决方案
用Vue做项目开发很久了,对于vuex能用.会用,但是因为状态脱离页面和刷新丢失两个原因,一直都有种抵触,特别是一些简单的数据都是通过query或者本地存储就解决了,然而对于一些复杂内容,不可避免的还 ...
- react-native-storage 使用笔记 持续更新
React-native-storage是在AsyncStorage之上封装的一个缓存操作插件库,刚开始接触这个也遇到了一些问题,在这里简单记录总结一下,碰到了就记下来,持续更新吧 1.安卓下stor ...
- yarn的学习-1-包管理工具
https://yarn.bootcss.com 使用yarn的原因: 1.速度超快 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载. 同时利用并行下载以最大化资源利用率,因此安装速度更快 ...
- android camera 摄像头预览画面变形
问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...