示例代码:

var Ftp = require('ftp');
var fs = require('fs');
var path = require('path'); // 首先判断参数中是否包含{dateString}
var args = process.argv.splice(2);
if (args.length < 1) {
console.error('usage: node ftpFilesGetter.js [dateString]');
process.exit(1);
}
var dateString = args[0]; // 根据dateString获得nextDay
var year = parseInt(dateString.substring(0,4)),
month = parseInt(dateString.substring(4,6)),
day = parseInt(dateString.substring(6,8));
var lastday;
if (month == 2) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) lastday = 29;
else lastday = 28;
} else if ([1, 3, 5, 7, 8, 10, 12].indexOf(month) != -1) lastday = 31;
else lastday = 30;
if (day < lastday) day ++;
else {
month ++;
if (month > 12) {
month = 1;
year ++;
}
}
if (month < 10) month = '0' + month;
if (day < 10) day = '0' + day;
var nextDay = `${year}${month}${day}`; // 判断下载文件所在的文件夹是否存在,如果不存在则创建
var rootDir = 'D:/test'; if (fs.existsSync(rootDir) == false) fs.mkdirSync(rootDir);
if (fs.existsSync(`${rootDir}/report_log`) == false) fs.mkdirSync(`${rootDir}/report_log`);
if (fs.existsSync(`${rootDir}/report`) == false) fs.mkdirSync(`${rootDir}/report`);
var logDir = `${rootDir}/report_log/${dateString}`; if (fs.existsSync(logDir) == false) fs.mkdirSync(logDir);
var nextDayLogDir = `${rootDir}/report_log/${nextDay}`; if (fs.existsSync(nextDayLogDir) == false) fs.mkdirSync(nextDayLogDir);
var dataDir = `${rootDir}/report/${dateString}`; if (fs.existsSync(dataDir) == false) fs.mkdirSync(dataDir); // 登陆ftp
var connectionProperties = {
host: 'xxx.xxx.xxx.xxx',
user: 'stp_username',
password: 'ftp_password'
};
var ftp = new Ftp();
ftp.on('ready', ()=>{
console.log('connect to ftp ok!');
var needFileList = [];
var callback = function() {
console.log(`2 log files + many data files, total : ${needFileList.length} files!`);
var cnt = 0;
needFileList.forEach(file => {
var filename = file.substring(file.lastIndexOf('/') + 1);
var localFile;
if (file.substring(0,12) == `log/${dateString}`) { // 今天的log
localFile = `${logDir}/${filename}`;
}
else if (file.substring(0,12) == `log/${nextDay}`) { // 明天的log
localFile = `${nextDayLogDir}/${filename}`;
} else { // data
localFile = `${dataDir}/${filename}`;
}
ftp.get(file, (err, stream)=>{
stream.once('close', ()=>{
cnt ++;
console.log(`(${cnt}) download ${file} --> ${localFile} succeed!`);
if (cnt >= needFileList.length) {
console.log('process successfully end!');
process.exit(0);
}
});
stream.pipe(fs.createWriteStream(localFile));
}); });
}
ftp.list(`log/${dateString}`, (err, list)=>{
list.forEach(item => needFileList.push(`log/${dateString}/${item.name}`));
ftp.list(`log/${nextDay}`, (err, list)=>{
list.forEach(item => needFileList.push(`log/${nextDay}/${item.name}`));
ftp.list(`sdata/S-999000`, (err, list)=>{
var sysIdList = list.map(item => { return item.name });
var cnt1 = 0; // cnt1用于记录sysId的个数,当等于sysIdList.length的时候说明遍历完了
var tmpDirList = [];
sysIdList.forEach(sysId => {
ftp.list(`sdata/S-999000/${sysId}`, (err, list)=>{
cnt1 ++;
list.forEach(item => tmpDirList.push(`sdata/S-999000/${sysId}/${item.name}`));
if (cnt1 >= sysIdList.length) {
var cnt2 = 0;
tmpDirList.forEach(tmpDir =>{
ftp.list(`${tmpDir}/${dateString}`, (err, list)=>{
cnt2 ++;
list.forEach(item => needFileList.push(`${tmpDir}/${dateString}/${item.name}`));
if (cnt2 >= tmpDirList.length) {
callback();
}
});
});
}
});
});
});
});
});
});
ftp.connect(connectionProperties);

Node.js使用ftp连接远程ftp服务器枚举和下载文件示例的更多相关文章

  1. Linux下不借助工具实现远程linux服务器上传下载文件

    # Linux下不借助工具实现远程linux服务器上传下载文件 ## 简介 - Linux下自带ssh工具,可以实现远程Linux服务器的功能- Linux下自带scp工具,可以实现文件传输功能 ## ...

  2. Centos下ftp协议连接远程ftp server主机

    环境说明 [root@Check3 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@Check3 ~]# uname -a L ...

  3. Notepad++ 连接远程 FTP 进行文件编辑

    一.下载安装 Notepad++ 1.下载 Notepad++ : https://pan.baidu.com/s/1o7VrS4y 密码 : ck8a 2.安装 Notepad++ 2.1.勾选所有 ...

  4. paip.最好的脚本语言node js 环境搭建连接mysql

    paip.最好的脚本语言node js 环境搭建连接mysql #====下载node...走十一个exe..容易的.. 1 #0----Hello world   .js 2 #---------模 ...

  5. [转]用Node.js创建自签名的HTTPS服务器

    用Node.js创建自签名的HTTPS服务器 创建自己的CA机构 创建服务器端证书 创建客户端证书 将证书打包 创建自己的CA机构 为CA生成私钥 openssl genrsa -out ca-key ...

  6. 前端使用node.js的http-server开启一个本地服务器

    前端使用node.js的http-server开启一个本地服务器 在写前端页面中,经常会在浏览器运行HTML页面,从本地文件夹中直接打开的一般都是file协议,当代码中存在http或https的链接时 ...

  7. 如何配置pl/sql 连接远程oracle服务器

    在下边的两种情况下,如何配置pl/sql 连接远程oracle服务器 1)在客户端不装oracle 客户端也不装服务器,能否配置pl/sql 连接远程oracle服务器,如何配置,请给出详细的文档说明 ...

  8. Node.js创建自签名的HTTPS服务器

    https://cnodejs.org/topic/54745ac22804a0997d38b32d  用Node.js创建自签名的HTTPS服务器  发布于 4 年前  作者 eeandrew  6 ...

  9. 搭建linux远程服务器和传输下载文件

    其实,将ubuntu系统设置为服务器很简单,只需要开启ssh服务就可以了.开启了ssh服务以后,其它电脑就可以通过ssh登录你的这台ubuntu服务器.SSH分客户端openssh-client和op ...

随机推荐

  1. 11 loader - 配置处理scss文件的loader

    1.装包 cnpm i sass-loader -D peerDependencies WARNING sass-loader@* requires a peer of node-sass@^4.0. ...

  2. 多任务创建-线程(IO密集型适用)

    单核CPU:时间片轮转 并行:CPU的个数大于等于任务数 真的多任务执行 并发:CPU的个数小于任务数 假的多任务 知识点: 多线程共享全局变量 创建线程的两种方法: 1.创建子线程方法 调用函数 T ...

  3. Selenium常用API的使用java语言之9-模拟键盘操作

    Keys()类提供了键盘上几乎所有按键的方法. 前面了解到, sendKeys()方法可以用来模拟键盘输入, 除此之 外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A. Ct ...

  4. 基于TCP协议套接字,服务端实现接收客户端的连接并发

    基于TCP协议套接字,服务端实现接收客户端的连接并发 服务端 import socket from multiprocessing import Process server=socket.socke ...

  5. C# 调用cmd执行命令

    private void CmdRun_Click(object sender, EventArgs e)        {            Process p = new Process(); ...

  6. LeetCode 339. Nested List Weight Sum

    原题链接在这里:https://leetcode.com/problems/nested-list-weight-sum/ 题目: Given a nested list of integers, r ...

  7. MD5加密的引用

    使用MD5 加密时 需要在后台代码中添加using System.Security.Cryptography; 引用 //MD5加密密码 byte[] a = MD5.Create().Compute ...

  8. jQuery相关方法2

    一.元素样式设置的方式(css,json键值对,链式编程) <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js ...

  9. jQuery相关方法10

    一.链式编程的原理 <script> //构造函数 function Person(age){ this.age=age; this.sayHi=function(txt){ if(txt ...

  10. hdu 5452

    无意中看到这道题 没读懂英文题面 百度题解寻找题面 看到: #include <iostream> #include <cstdio> #include <algorit ...