被动模式下

//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上传的更多相关文章

  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. Log4Net记录到文件

    将这篇文章的配置文件中的log4net节点下的内容替换成下面的 https://www.cnblogs.com/RambleLife/p/9165248.html <log4net debug= ...

  2. linux内核完全剖析——基于0.12内核-笔记(2)-统一编址和独立编址

    IO是什么 ? IO(Input and Output)是输入输出接口.是CPU和其他外部设备(如串口.LCD.触摸屏.LED等)之间通信的接口.一般的,我们说的IO就是指CPU的各种内部或外部外设. ...

  3. 从外部导入django模块

    import os import sys sys.path.append("D:\\pyweb\\sf"); # 项目位置(不是app) os.environ.setdefault ...

  4. C# 泛型约束 xxx Where T:约束(二)

    泛型是什么? 通过上篇的实例  C# 泛型约束 xxx<T> Where T:约束(一),我们对泛型有一定的认识. 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程 ...

  5. 15 Top Paying IT Certifications In 2016: AWS Certified Solutions Architect Leads At $125K

    Each of the five Amazon Web Services (AWS) certifications brings in an average salary of more than $ ...

  6. HTML5新特性postMessage解决跨域

    window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息.基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信.让我们来看一下 ...

  7. 请问下.net俱乐部这个组织现在还存在么?

    各位好,我是北京的一名.net开发人员,一直在想有什么线下技术活动可以开拓自己的视野,扩展人脉,我知道曾经有一个.net俱乐部很活跃 可是现在我在百度上搜了下.net俱乐部的信息,已经基本找不到201 ...

  8. Android Bitmap Drawable byte[] InputStream 相互转换方法

    用android处理图片的时候,由于得到的资源不一样,所以经常要在各种格式中相互转化,以下介绍了 Bitmap Drawable byte[] InputStream 之间的转换方法: import ...

  9. Https 安全传输的原理

    序言 今天来聊一聊https 安全传输的原理. 在开始之前,我们来虚构两个人物, 一个是位于中国的张大胖(怎么又是你?!), 还有一个是位于米国的Bill (怎么还是你?!). 这俩哥们隔着千山万水, ...

  10. 2018-2019-2 20165302 Exp5 MSF基础应用

    1.实验目的 掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路 2.实验内容 一个主动攻击实践; (1分) MS17-010 一个针对浏览器的攻击:(1分) ms14_064 一个 ...