被动模式下

//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. X-Pack权限控制之给Kibana加上登录控制以及index_not_found_exception问题解决

    无法查看索引下的日志问题解决 好事多磨,我们还是无法在Kibana下看到数据,究竟是怎么一回事呢? 笔者再次查看了logstash的控制台,又发现了如下错误: logstash outputs ela ...

  2. DevExpress 使用条形码二维码控件打印

    参考文章: https://www.cnblogs.com/wuhuacong/p/6112976.html 转载请注明出处:撰写人:伍华聪 其实主要是二维码的实现,在使用条形码控件时,又一个属性Sy ...

  3. October 13th 2017 Week 41st Friday

    The shortest distance between two people is a smile. 人与人之间最短的距离是微笑. I find a smiling face can bring ...

  4. windows系统显示隐藏文件以及显示文件扩展名

    1.XP系统 打开“我的电脑”,“工具”,“文件夹选项” 勾选如下图 2.win7系统 打开“计算机”,“组织”,“文件夹和搜索选项” 勾选如下图 3.win10系统 打开“此电脑”,“查看”,勾选如 ...

  5. 2-3 R语言基础 矩阵和数组

    #矩阵Matrix  三个参数:内容(可省),行数,列数 > x <- matrix(1:6,nrow = 3,ncol = 2) #第一个是内容,第二个,第三个是行列> x[1,2 ...

  6. 一些node模块的学习思考

    12月14日清单 1 readline模块 var readline = require("readline"); // input 是必须的,output是可选的 rl = re ...

  7. Redis系列一:reids的单机版安装

    环境:VM+centos6+xshell 1.准备好linux的虚拟机,这里用的是centos6,具体方法百度 2.进入software目录,创建一个redis的目录来存放下载的redis包 cd s ...

  8. PHP判断用户是否手机访问

    自定义的函数如下: $agent = check_wap(); if( $agent ) { header('Location: http://www.nowamagic.net'); exit; } ...

  9. 2.3.2 EditText(输入框)详解

    本节引言: 上一节中我们学习了第一个 UI控件TextView(文本框),文中给出了很多实际开发中可能遇到的一些需求 的解决方法,应该会为你的开发带来便利,在本节中,我们来学习第二个很常用的控件Edi ...

  10. linux 的常用命令---------第九阶段

    Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...