分类:
FTP_NPOI
这几天做了一个关于FTP与服务器之间文件互相传输的Windows服务,本地开发的时候非常顺利,很快就开发完成了,可是将服务部署到服务器上的时候,却出现了许多的意外,让人防不胜防,今天就总结一下我在工作过程中遇到的问题。
先上我的代码吧,然后再讲解(代码主要是记录给我自己看的,可以直接跳过看问题):
1.这是Program.cs文件的代码:
using System.ServiceProcess;
namespace ECI.SW.HandleStorageMessageService
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
// 实例化我的服务类
new HandleStorageMessageService()
};
// 运行服务类
ServiceBase.Run(ServicesToRun);
#region test code begin
// 控制台方式调用服务类中的方法
// ServiceExcute.GygHandleMessage();
#endregion test code end
}
}
}2.HandleStorageMessageService类中的代码
using ECI.SW.HandleStorageMessageService.Model;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using PL.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Xml;
namespace ECI.SW.HandleStorageMessageService
{
/// <summary>
/// 电子口岸发送企业集装箱堆场数据服务
/// <author>Asa</author>
/// <createDate>2019/06/13</createDate>
/// </summary>
public partial class HandleStorageMessageService : ServiceBase
{
/// <summary>
/// 构造函数
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
public HandleStorageMessageService()
{
InitializeComponent();
}
/// <summary>
/// 服务启动时执行
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
/// <param name="args">args</param>
protected override void OnStart(string[] args)
{
// 控制台方式调试时注释掉
//ServiceExcute.Init();
}
/// <summary>
/// 服务停止时执行
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
protected override void OnStop()
{
}
}
/// <summary>
/// 处理堆场信息
/// <author>Asa</author>
/// <createDate>2019/06/14</createDate>
/// </summary>
public class ServiceExcute
{
// 定义一个定时器(控制台方式调试时注释掉)
private static Timer timer;
/// <summary>
/// 初始化定时器(控制台方式调试时注释掉)
/// <author>Asa</author>
/// <createDate>2019/06/14</createDate>
/// </summary>
public static void Init()
{
try
{
// 数据来源
string DataSource = EciConfig.Read("DataSource");
// timer执行间隔时间
int seconds = Convert.ToInt32(EciConfig.Read("ReadFileTime")) * 60000;
timer = new Timer(seconds);
if (DataSource.Equals("GYG"))
{
timer.Elapsed += new ElapsedEventHandler(GygHandleMessage);
}
// 是否使用定时器
timer.Enabled = true;
}
catch (Exception ex)
{
Log.Write("init出错:" + ex.Message, "initCatch");
}
}
/// <summary>
/// 果园港(Gyg)堆场数据文件处理 object sender, EventArgs e
/// <author>Asa</author>
/// <createDate>2019/06/14</createDate>
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">e</param>
public static void GygHandleMessage(object sender, EventArgs e)
{
try
{
// 字母转ASCII码,这里不需要
// AlphabetToNumber();
#region 读取配置信息,声明必要的对象--BEGIN(这里因为我需要将读取的Excel转为XML保存到服务器,所以配置了很多地址,按自己需要配置)
// 读取FTP访问地址
string ftpPath = EciConfig.Read("ftpPath");
// 读取ftp访问用户名
string userName = EciConfig.Read("userName");
// 读取ftp访问密码
string pwd = EciConfig.Read("pwd");
// 读取excel文件保存的路径
string saveExcelFilePath = EciConfig.Read("saveExcelFilePath");
// 读取xml文件保存的路径
string saveXmlFilePath = EciConfig.Read("saveXmlFilePath");
// 读取单一窗口服务器上回执报文保存的地址
string readXmlFilePath = EciConfig.Read("readXmlFilePath");
// 读取sheetname
string sheetName = EciConfig.Read("sheetName");
// 实例化一个Datatable对象接收Excel转换的Datatable(这里顺便可以学习npoi读取Excel并转Datatable的方法)
DataTable excelDt = new DataTable();
#endregion 读取配置信息,声明必要的对象--END
#region 处理堆场数据--BEGIN
// 连接FTP,这里使用了一个我的FTPhelper类,等会儿会贴上来
Common.FTP.FtpHelper ftpHelper = new Common.FTP.FtpHelper(ftpPath, "", userName, pwd);
// 获取FTP上的文件列表
string[] fileNameArray = ftpHelper.GetFileList("");
// 判断文件列表是否为空
if (fileNameArray != null)
{
// 遍历文件列表,从FTP服务器下载对应文件
foreach (string fileName in fileNameArray)
{
#region 判断是否是Excel文件
// 获取文件拓展名
string extensionName = fileName.Substring(fileName.LastIndexOf("."));
// 获取文件名
string fileNameNoExtension = fileName.Substring(0, fileName.LastIndexOf("."));
// 判断文件是否是Excel文件
if (!extensionName.Equals(".xls") && !extensionName.Equals(".xlsx"))
{
continue;
}
#endregion
#region 下载堆场数据Excel文件--BEGIN
// 判断保存Excel文件的路径是否存在,如果不存在就创建该地址
if (!Directory.Exists(saveExcelFilePath))
Directory.CreateDirectory(saveExcelFilePath);
// 判断文件是否已下载,如果已下载则跳过
if (File.Exists(saveExcelFilePath + "/" + fileName))
continue;
// 根据文件名下载文件
ftpHelper.Download(saveExcelFilePath, fileName);
#endregion 下载堆场数据Excel文件--END
#region 处理堆场数据Excel文件(这一块是我对读取到的FTP文件做的我自己的业务需求处理,可以不看)--BEGIN
#region XML头信息实体--BEGIN
// 当前时间
DateTime datetimeNow = DateTime.Now;
// 报文编码
string msgId = "01" + "CNCQI800028" + datetimeNow.ToString("yyyyMMddHHmmssfff");
// 实例化XML头实体对象
SwStorageMessageHead swStorageMessageHead = new SwStorageMessageHead();
// 报文编码
swStorageMessageHead.MSG_ID = msgId;
// 报文类型
swStorageMessageHead.MSG_TYPE = "CSA01";
// 关卡代码
swStorageMessageHead.CUSTOMS_CODE = "8007";
// 作业场所编号
swStorageMessageHead.SUPV_LOCT_CODE = "CNCQI800028";
// 报文发送时间
swStorageMessageHead.DECL_DATE = datetimeNow.ToString();
// 申报数据类型
swStorageMessageHead.DECLARE_DATE_TYPE = "0";
// 申报数据报文总数
swStorageMessageHead.TOTAL_MSG_NO = "1";
// 当前报文序号
swStorageMessageHead.CUR_MSG_NO = "1";
// 堆场信息XML文件头数据插入SQL语句
StringBuilder insertHeadBuilder = new StringBuilder();
BuildHeadInsertSql(insertHeadBuilder, swStorageMessageHead);
try
{
// 初始化connectionstring连接字符串对象
EciServer.InitFramework();
// 插入XML头数据
DBHelper.ExecuteNoneQuery(insertHeadBuilder.ToString());
}
catch (Exception ex)
{
Log.Write("SwStorageMessageHead插入失败:" + ex.Message, "InsertErr");
}
#endregion XML头信息实体--END
#region XML基础信息写入--BEGIN
// 实例化一个操作XML文件的对象
XmlDocument xmldoc = new XmlDocument();
// 实例化一个填写版本等信息的XML节点对象(创建具有指定值的xmldeclaration节点)
XmlNode versionNode = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", "");
// 将指定的节点添加到子节点列表的末尾
xmldoc.AppendChild(versionNode);
// 创建xmldocument中的单个节点(根节点)
XmlNode rootNode = xmldoc.CreateElement("ContaDeclareInfo");
// 将根节点添加到子节点列表的末尾
xmldoc.AppendChild(rootNode);
#endregion XML基础信息写入--END
#region xml信息写入--BEGIN
// 创建XML头节点
CreateHeadNode(xmldoc, rootNode, swStorageMessageHead);
// 创建XML--Declaratioin节点
XmlNode declareationNode = xmldoc.CreateNode(XmlNodeType.Element, "Declaratioin", null);
try
{
// 调用读取Excel转换为Datatable的方法
excelDt = ReadExcelToDataTable(saveExcelFilePath + "\\" + fileName, sheetName);
}
catch (Exception dtEx)
{
Log.Write("Excel转换为Datatable出错:" + dtEx.Message, "ToDatatableErr");
}
if (excelDt != null && excelDt.Rows.Count > 0)
// 执行数据插入list表并生成对应Declaratioin--XML节点
InsertListDbAndCreateListXmlExecute(excelDt, msgId, xmldoc, declareationNode);
// 将Declaratioin节点添加到根节点
rootNode.AppendChild(declareationNode);
#endregion xml信息写入--END
#region 保存创建的XML文件--BEGIN
try
{
xmldoc.Save(saveXmlFilePath + "\\" + fileNameNoExtension + ".xml");
}
catch (Exception ex)
{
Log.Write("保存xml文件失败:" + ex.Message, "saveXmlErr");
}
#endregion 保存创建的XML文件--END
#endregion 处理堆场数据Excel文件--END
}
}
#endregion 处理堆场数据--END
// 处理回执报文信息
HandleResponseXml(readXmlFilePath, ftpHelper);
}
catch (Exception ex)
{
Log.Write("UnExpectedError:" + ex.Message, "UnExpectedError");
}
}
// 这下面都是我的工具方法,可以不看
// 字母转换为ASCII码数字
public static string AlphabetToNumber()
{
byte[] array = new byte[1]; //定义一组数组array
array = Encoding.ASCII.GetBytes("E"); //string转换的字母
int asciicode = (short)(array[0]);
string ascii = Convert.ToString(asciicode); //将转换一的ASCII码转换成string型
return ascii;
}
/// <summary>
/// 读取Excel文件并转化为Datatable
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
/// <param name="filePath">文件地址</param>
/// <param name="sheetname">sheet名称</param>
/// <returns></returns>
public static DataTable ReadExcelToDataTable(string filePath, string sheetname)
{
#region 实例化必要的对象--BEGIN
// 声明一个IWorkbook对象
IWorkbook workbook = null;
// 实例化一个ISheet对象,用来接收读取到的sheet
ISheet sheet = null;
// 实例化一个Datatable对象
DataTable dt = new DataTable();
// 判断文件是否存在,不存在返回空
if (!File.Exists(filePath))
return null;
// 将读取到的文件转为文件流
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
#endregion 实例化必要的对象--END
#region 根据Excel文件的版本使用不同的IWorkbook对象--BEGIN
// 判断读取到的Excel文件的版本
if (filePath.IndexOf(".xlsx") > 0)
{
// 2007版本
workbook = new XSSFWorkbook(fs);
}
else if (filePath.IndexOf(".xls") > 0)
{
// 2003版本
workbook = new HSSFWorkbook(fs);
}
#endregion 根据Excel文件的版本使用不同的IWorkbook对象--END
// 接收读取到的sheet
sheet = workbook.GetSheet(sheetname);
#region 对sheet表进行处理==>转换为Datatable--BEGIN
var rows = sheet.GetRowEnumerator();
while (rows.MoveNext())
{
IRow row = rows.Current as IRow;
if (row.RowNum == 0)
{
row.Cells.ForEach(cell =>
{
dt.Columns.Add(cell.StringCellValue);
});
}
else
{
var dr = dt.NewRow();
for (int i = 0; i < row.Cells.Count; i++)
{
dr[i] = row.Cells[i].ToString();
}
dt.Rows.Add(dr);
}
}
#endregion 对sheet表进行处理==>转换为Datatable--END
return dt;
}
/// <summary>
/// 处理回执报文
/// <author>Asa</author>
/// <createDate>2019/06/19</createDate>
/// </summary>
/// <param name="readXmlFilePath">读取回执报文的路径</param>
/// <param name="fileNameArray">FTP服务器上现有的文件名列表</param>
/// <param name="ftpHelper">FTP工具类对象</param>
public static void HandleResponseXml(string readXmlFilePath, Common.FTP.FtpHelper ftpHelper)
{
// 获取文件列表
string[] fileNameArr = ftpHelper.GetFileList("");
// 读取所有的回执报文XML文件
DirectoryInfo receiptXmlList = new DirectoryInfo(readXmlFilePath);
// 遍历文件列表,获取XML文件
foreach (FileInfo receiptXml in receiptXmlList.GetFiles("*.xml"))
{
// 实例化一个XML操作对象
XmlDocument xmldoc = new XmlDocument();
// 通过URL加载XML文件
xmldoc.Load(receiptXml.FullName);
// 定义一个标记判断报文是否已存在
bool isExists = false;
#region 上传读取的回执XML文件--BEGIN
try
{
// 遍历FTP文件列表
foreach (string fileName in fileNameArr)
{
// 判断回执报文是否已存在,已存在则不上传
if (fileName.Equals(receiptXml.Name))
{
isExists = true;
break;
}
}
// 如果回执报文不存在,则上传
if (!isExists)
ftpHelper.Upload(receiptXml.FullName);
else
continue;
}
catch (Exception ex)
{
Log.Write("上传xml回执文件失败:" + ex.Message, "saveXmlErr");
}
#endregion 上传读取的回执XML文件--END
#region 回执报文数据入库--BEGIN
#region 获取回执报文XML节点--BEGIN
// 报文编码
XmlNode msgId = xmldoc.SelectSingleNode("//MsgId");
// 报文类型
XmlNode msgType = xmldoc.SelectSingleNode("//MsgType");
// 关卡代码
XmlNode customsCode = xmldoc.SelectSingleNode("//CustomsCode");
// 作业场所编码
XmlNode supvLoctCode = xmldoc.SelectSingleNode("//SupvLoctCode");
// 报文发送时间
XmlNode declDate = xmldoc.SelectSingleNode("//DeclDate");
// 回执结果
XmlNode result = xmldoc.SelectSingleNode("//Result");
// 备注信息
XmlNode remark = xmldoc.SelectSingleNode("//Remark");
#endregion 回执报文数据入库--END
#region 回执报文表头实体赋值--BEGIN
// 回执报文表头实体赋值
SwStorageResponseHead swStorageResponseHead = new SwStorageResponseHead();
swStorageResponseHead.MSG_ID = msgId.InnerText;
swStorageResponseHead.MSG_TYPE = msgType.InnerText;
swStorageResponseHead.CUSTOMS_CODE = customsCode.InnerText;
swStorageResponseHead.SUPV_LOCT_CODE = supvLoctCode.InnerText;
swStorageResponseHead.DECL_DATE = declDate.InnerText;
// 实例化一个stringbuilder对象用来拼接表头插入语句
StringBuilder insertResponseHeadBuilder = new StringBuilder();
BuildResponseHeadInserSql(insertResponseHeadBuilder, swStorageResponseHead);
#endregion 回执报文表头实体赋值--END
#region 执行回执报文表头数据入库--BEGIN
try
{
// 初始化connectionstring连接字符串对象
EciServer.InitFramework();
// 插入XML头数据
DBHelper.ExecuteNoneQuery(insertResponseHeadBuilder.ToString());
}
catch (Exception ex)
{
Log.Write("SwStorageResponseHead插入失败:" + ex.Message, "InsertErr");
}
#endregion 执行回执报文表头数据入库--END
#region 回执报文表体实体赋值--BEGIN
// 回执报文表体赋值
SwStorageResponseList swStorageResponseList = new SwStorageResponseList();
swStorageResponseList.MSG_ID = msgId.InnerText;
swStorageResponseList.RESULT = result.InnerText;
swStorageResponseList.REMARK = remark.InnerText;
// 实例化一个stringbuilder对象拼接表体插入语句
StringBuilder insertResponseListBuilder = new StringBuilder();
BuildResponseListInserSql(insertResponseListBuilder, swStorageResponseList);
#endregion 回执报文表体实体赋值--END
#region 执行回执报文表体数据入库--BEGIN
try
{
// 初始化connectionstring连接字符串对象
EciServer.InitFramework();
// 插入XML头数据
DBHelper.ExecuteNoneQuery(insertResponseListBuilder.ToString());
}
catch (Exception ex)
{
Log.Write("SwStorageResponseList插入失败:" + ex.Message, "InsertErr");
}
#endregion 执行回执报文表体数据入库--END
#endregion 回执报文数据入库--END
}
}
/// <summary>
/// 执行数据插入list表并生成对应Declaratioin--XML节点
/// <author>Asa</author>
/// <createDate>2019/06/18</createDate>
/// </summary>
/// <param name="ds">读取Excel生成的dataset</param>
/// <param name="msgId">报文编码</param>
/// <param name="xmldoc">xmldocument对象</param>
/// <param name="declareationNode">Declaratioin节点</param>
public static void InsertListDbAndCreateListXmlExecute(DataTable excelDt, string msgId, XmlDocument xmldoc, XmlNode declareationNode)
{
// 遍历dataset,读取Excel中的堆场数据并存入表中
for (int i = 3; i < excelDt.Rows.Count; i++)
{
#region XML数据信息实体--BEGIN
SwStorageMessageList swStorageMessageList = new SwStorageMessageList();
// 报文编码
swStorageMessageList.MSG_ID = msgId;
// 集装箱号
swStorageMessageList.CONTA_ID = excelDt.Rows[i][4].ToString();
// 判断是否是列名,如果是列名就跳过这一行
if (swStorageMessageList.CONTA_ID.Equals("箱号") || swStorageMessageList.CONTA_ID.NullOrEmpty())
continue;
// 集装箱尺寸
swStorageMessageList.CONTA_TYPE_CODE = excelDt.Rows[i][5].ToString();
// 箱位代码
swStorageMessageList.SEAT = excelDt.Rows[i][15].ToString();
// 将箱位代码转换为正确的格式
swStorageMessageList.SEAT = swStorageMessageList.SEAT.Replace("-", "/0");
#region 内外贸标识--BEGIN
swStorageMessageList.TRADE_MARK = excelDt.Rows[i][2].ToString();
if (swStorageMessageList.TRADE_MARK.Equals("内贸"))
swStorageMessageList.TRADE_MARK = "D";
else if (swStorageMessageList.TRADE_MARK.Equals("外贸"))
swStorageMessageList.TRADE_MARK = "I";
else
swStorageMessageList.TRADE_MARK = "O";
#endregion 内外贸标识--END
#region 进出口标识--BEGIN
swStorageMessageList.IE_FLAG = excelDt.Rows[i][10].ToString();
if (swStorageMessageList.IE_FLAG.Equals("进口"))
swStorageMessageList.IE_FLAG = "I";
else if (swStorageMessageList.IE_FLAG.Equals("出口"))
swStorageMessageList.IE_FLAG = "E";
#endregion 进出口标识--END
// 拼箱状态
swStorageMessageList.CONTA_MARK = "";
// 装载状态
swStorageMessageList.LOAD_MARK = excelDt.Rows[i][7].ToString();
// 危品柜状态
swStorageMessageList.DANGER_MARK = "";
// 进场时间
swStorageMessageList.ENTRANCE_DATE = excelDt.Rows[i][23].ToString();
// 出场时间
swStorageMessageList.DEPART_TRUE_DATE = "";
// 当前状态
swStorageMessageList.WORK_MARK = "A";
// 数据处理标识
swStorageMessageList.DATA_DEAL_FLAG = "A";
// 提单号
swStorageMessageList.BILL_NO = excelDt.Rows[i][14].ToString();
// 报关单号
swStorageMessageList.ENTRY_ID = "";
// 转关单号
swStorageMessageList.PRE_NO = "";
// 多式联运单号
swStorageMessageList.MT_APPLY_NO = "";
// 备注
swStorageMessageList.REMARK = "备注信息";
// 计划状态
swStorageMessageList.PLAN_STATUS = excelDt.Rows[i][1].ToString();
// 是否中转
swStorageMessageList.IS_TRANSFER = excelDt.Rows[i][3].ToString();
// 箱型
swStorageMessageList.CONTA_TYPE = excelDt.Rows[i][6].ToString();
// 箱货类
swStorageMessageList.CONTA_GOODS_TYPE = excelDt.Rows[i][8].ToString();
// 货柜
swStorageMessageList.CONTAINER = excelDt.Rows[i][9].ToString();
// 箱主
swStorageMessageList.CONTA_OWNER = excelDt.Rows[i][11].ToString();
// 船公司
swStorageMessageList.BOAT_COMPANY = excelDt.Rows[i][12].ToString();
// 代理公司
swStorageMessageList.AGENT_COMPANY = excelDt.Rows[i][13].ToString();
// 铅封
swStorageMessageList.LEAD_SEALING = excelDt.Rows[i][16].ToString();
// 破损说明
swStorageMessageList.DAMAGE_DESCRIPTION = excelDt.Rows[i][17].ToString();
// 破损代码
swStorageMessageList.DAMAGE_CODE = excelDt.Rows[i][18].ToString();
// 进口船名
swStorageMessageList.I_BOAT_NAME = excelDt.Rows[i][19].ToString();
// 进口航次
swStorageMessageList.I_BOAT_VOYAGENO = excelDt.Rows[i][20].ToString();
// 出口船名
swStorageMessageList.E_BOAT_NAME = excelDt.Rows[i][21].ToString();
// 出口航次
swStorageMessageList.E_BOAT_VOYAGENO = excelDt.Rows[i][22].ToString();
// 堆存天
swStorageMessageList.STORAGE_DATE = excelDt.Rows[i][24].ToString();
// 货名
swStorageMessageList.GOODS_NAME = excelDt.Rows[i][25].ToString();
// 总重
swStorageMessageList.TOTAL_WEIGHT = excelDt.Rows[i][26].ToString();
// 货重
swStorageMessageList.GOODS_WEIGHT = excelDt.Rows[i][27].ToString();
// 堆场表体数据插入SQL语句
StringBuilder insertBodyBuilder = new StringBuilder();
BuildListInsertSql(insertBodyBuilder, swStorageMessageList);
try
{
// 初始化connectionstring连接字符串对象
EciServer.InitFramework();
DBHelper.ExecuteNoneQuery(insertBodyBuilder.ToString());
}
catch (Exception ex)
{
Log.Write("SwStorageMessageList插入失败:" + ex.Message, "InsertErr");
}
#endregion XML数据信息实体--END
// 创建XML-->Declaration节点的子节点(Data)信息
CreateDataNode(xmldoc, declareationNode, swStorageMessageList);
}
}
/// <summary>
/// 创建XML头节点的信息
/// <author>Asa</author>
/// <createDate>2019/06/18</createDate>
/// </summary>
/// <param name="xmldoc">XmlDocument对象</param>
/// <param name="rootNode">根节点</param>
/// <param name="swStorageMessageHead">头信息实体对象</param>
public static void CreateHeadNode(XmlDocument xmldoc, XmlNode rootNode, SwStorageMessageHead swStorageMessageHead)
{
// 声明一个装载XML头信息的节点
XmlNode headNode = xmldoc.CreateNode(XmlNodeType.Element, "Head", null);
// 报文编码节点
XmlNode msgIdNode = xmldoc.CreateNode(XmlNodeType.Element, "MsgId", null);
// 报文类型节点
XmlNode msgTypeNode = xmldoc.CreateNode(XmlNodeType.Element, "MsgType", null);
// 关卡代码节点
XmlNode customsCodeNode = xmldoc.CreateNode(XmlNodeType.Element, "CustomsCode", null);
// 作业场所编号节点
XmlNode supvLoctCodeNode = xmldoc.CreateNode(XmlNodeType.Element, "SupvLoctCode", null);
// 报文发送时间节点
XmlNode declDateNode = xmldoc.CreateNode(XmlNodeType.Element, "DeclDate", null);
// 数据申报类型节点
XmlNode declareDataTypeNode = xmldoc.CreateNode(XmlNodeType.Element, "DeclareDataType", null);
// 申报数据报文总数节点
XmlNode totalMsgNoNode = xmldoc.CreateNode(XmlNodeType.Element, "TotalMsgNo", null);
// 当前报文序号节点
XmlNode curMsgNoNode = xmldoc.CreateNode(XmlNodeType.Element, "CurMsgNo", null);
// 给各个头信息子节点赋值
msgIdNode.InnerText = swStorageMessageHead.MSG_ID;
msgTypeNode.InnerText = swStorageMessageHead.MSG_TYPE;
customsCodeNode.InnerText = swStorageMessageHead.CUSTOMS_CODE;
supvLoctCodeNode.InnerText = swStorageMessageHead.SUPV_LOCT_CODE;
declDateNode.InnerText = swStorageMessageHead.DECL_DATE;
declareDataTypeNode.InnerText = swStorageMessageHead.DECLARE_DATE_TYPE;
totalMsgNoNode.InnerText = swStorageMessageHead.TOTAL_MSG_NO;
curMsgNoNode.InnerText = swStorageMessageHead.CUR_MSG_NO;
// 将各个头信息子节点添加到头信息根节点
headNode.AppendChild(msgIdNode);
headNode.AppendChild(msgTypeNode);
headNode.AppendChild(customsCodeNode);
headNode.AppendChild(supvLoctCodeNode);
headNode.AppendChild(declDateNode);
headNode.AppendChild(declareDataTypeNode);
headNode.AppendChild(totalMsgNoNode);
headNode.AppendChild(curMsgNoNode);
// 将头节点添加到根节点
rootNode.AppendChild(headNode);
}
/// <summary>
/// 创建XML数据节点的信息
/// <author>Asa</author>
/// <createDate>2091/06/18</createDate>
/// </summary>
/// <param name="xmldoc">XmlDocument对象</param>
/// <param name="declareationNode">Declaration节点</param>
/// <param name="swStorageMessageList"></param>
public static void CreateDataNode(XmlDocument xmldoc, XmlNode declareationNode, SwStorageMessageList swStorageMessageList)
{
// 声明一个装载XML-->Data信息的节点
XmlNode dataNode = xmldoc.CreateNode(XmlNodeType.Element, "Data", null);
// 集装箱号
XmlNode contaId = xmldoc.CreateNode(XmlNodeType.Element, "ContaId", null);
// 集装箱尺寸
XmlNode contaTypeCode = xmldoc.CreateNode(XmlNodeType.Element, "ContaTypeCode", null);
// 箱位代码
XmlNode seat = xmldoc.CreateNode(XmlNodeType.Element, "Seat", null);
// 内外贸标识
XmlNode tradeMark = xmldoc.CreateNode(XmlNodeType.Element, "TradeMark", null);
// 进出口标识
XmlNode iEFlag = xmldoc.CreateNode(XmlNodeType.Element, "IEFlag", null);
// 拼箱状态
XmlNode contaMark = xmldoc.CreateNode(XmlNodeType.Element, "ContaMark", null);
// 装载状态
XmlNode loadMark = xmldoc.CreateNode(XmlNodeType.Element, "LoadMark", null);
// 危品柜状态
XmlNode dangerMark = xmldoc.CreateNode(XmlNodeType.Element, "DangerMark", null);
// 进场时间
XmlNode entranceDate = xmldoc.CreateNode(XmlNodeType.Element, "EntranceDate", null);
// 出场时间
XmlNode departtureDate = xmldoc.CreateNode(XmlNodeType.Element, "DeparttureDate", null);
// 当前状态
XmlNode workMark = xmldoc.CreateNode(XmlNodeType.Element, "WorkMark", null);
// 数据处理标识
XmlNode dataDealFlag = xmldoc.CreateNode(XmlNodeType.Element, "DataDealFlag", null);
// 提单号
XmlNode billNo = xmldoc.CreateNode(XmlNodeType.Element, "BillNo", null);
// 报关单号
XmlNode entryId = xmldoc.CreateNode(XmlNodeType.Element, "EntryId", null);
// 转关单号
XmlNode preNo = xmldoc.CreateNode(XmlNodeType.Element, "PreNo", null);
// 多式联运单号
XmlNode mtApplyBlNo = xmldoc.CreateNode(XmlNodeType.Element, "MtApplyBlNo", null);
// 备注信息
XmlNode remark = xmldoc.CreateNode(XmlNodeType.Element, "Remark", null);
// 给各个Data信息子节点赋值
contaId.InnerText = swStorageMessageList.CONTA_ID;
contaTypeCode.InnerText = swStorageMessageList.CONTA_TYPE_CODE;
seat.InnerText = swStorageMessageList.SEAT;
tradeMark.InnerText = swStorageMessageList.TRADE_MARK;
iEFlag.InnerText = swStorageMessageList.IE_FLAG;
contaMark.InnerText = swStorageMessageList.CONTA_MARK;
loadMark.InnerText = swStorageMessageList.LOAD_MARK;
dangerMark.InnerText = swStorageMessageList.DANGER_MARK;
entranceDate.InnerText = swStorageMessageList.ENTRANCE_DATE;
departtureDate.InnerText = swStorageMessageList.DEPART_TRUE_DATE;
workMark.InnerText = swStorageMessageList.WORK_MARK;
dataDealFlag.InnerText = swStorageMessageList.DATA_DEAL_FLAG;
billNo.InnerText = swStorageMessageList.BILL_NO;
entryId.InnerText = swStorageMessageList.ENTRY_ID;
preNo.InnerText = swStorageMessageList.PRE_NO;
mtApplyBlNo.InnerText = swStorageMessageList.MT_APPLY_NO;
remark.InnerText = swStorageMessageList.REMARK;
// 将各个信息节点加入Data节点
dataNode.AppendChild(contaId);
dataNode.AppendChild(contaTypeCode);
dataNode.AppendChild(seat);
dataNode.AppendChild(tradeMark);
dataNode.AppendChild(iEFlag);
dataNode.AppendChild(contaMark);
dataNode.AppendChild(loadMark);
dataNode.AppendChild(dangerMark);
dataNode.AppendChild(entranceDate);
dataNode.AppendChild(departtureDate);
dataNode.AppendChild(workMark);
dataNode.AppendChild(dataDealFlag);
dataNode.AppendChild(billNo);
dataNode.AppendChild(entryId);
dataNode.AppendChild(preNo);
dataNode.AppendChild(mtApplyBlNo);
dataNode.AppendChild(remark);
// 将data节点加入declareation节点
declareationNode.AppendChild(dataNode);
}
/// <summary>
/// 构建list表插入SQL语句
/// <author>Asa</author>
/// <createDate>2019/06/18</createDate>
/// </summary>
/// <param name="insertBodyBuilder">构建插入语句的对象</param>
/// <param name="swStorageMessageList">插入信息实体</param>
public static void BuildListInsertSql(StringBuilder insertBodyBuilder, SwStorageMessageList swStorageMessageList)
{
insertBodyBuilder.Append("INSERT INTO SW_STORAGE_MESSAGE_LIST(");
insertBodyBuilder.Append("MSG_ID,CONTA_ID,CONTA_TYPE_CODE,SEAT,TRADE_MARK,IE_FLAG,CONTA_MARK,");
insertBodyBuilder.Append("LOAD_MARK,DANGER_MARK,ENTRANCE_DATE,DEPART_TRUE_DATE,WORK_MARK,");
insertBodyBuilder.Append("DATA_DEAL_FLAG,BILL_NO,ENTRY_ID,PRE_NO,MT_APPLY_NO,REMARK,");
insertBodyBuilder.Append("PLAN_STATUS,IS_TRANSFER,CONTA_TYPE,CONTA_GOODS_TYPE,CONTAINER,");
insertBodyBuilder.Append("CONTA_OWNER,BOAT_COMPANY,AGENT_COMPANY,LEAD_SEALING,DAMAGE_DESCRIPTION,");
insertBodyBuilder.Append("DAMAGE_CODE,I_BOAT_NAME,I_BOAT_VOYAGENO,E_BOAT_NAME,E_BOAT_VOYAGENO,STORAGE_DATE,");
insertBodyBuilder.Append("GOODS_NAME,TOTAL_WEIGHT,GOODS_WEIGHT) VALUES(");
insertBodyBuilder.Append("'" + swStorageMessageList.MSG_ID + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_ID + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_TYPE_CODE + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.SEAT + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.TRADE_MARK + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.IE_FLAG + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_MARK + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.LOAD_MARK + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.DANGER_MARK + "',");
insertBodyBuilder.Append("to_date('" + swStorageMessageList.ENTRANCE_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),"); //("'" + swStorageMessageList.ENTRANCE_DATE + "'");
insertBodyBuilder.Append("to_date('" + swStorageMessageList.DEPART_TRUE_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),"); //("'" + swStorageMessageList.DEPART_TRUE_DATE + "'");
insertBodyBuilder.Append("'" + swStorageMessageList.WORK_MARK + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.DATA_DEAL_FLAG + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.BILL_NO + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.ENTRY_ID + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.PRE_NO + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.MT_APPLY_NO + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.REMARK + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.PLAN_STATUS + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.IS_TRANSFER + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_TYPE + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_GOODS_TYPE + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTAINER + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_OWNER + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.BOAT_COMPANY + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.AGENT_COMPANY + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.LEAD_SEALING + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.DAMAGE_DESCRIPTION + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.DAMAGE_CODE + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.I_BOAT_NAME + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.I_BOAT_VOYAGENO + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.E_BOAT_NAME + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.E_BOAT_VOYAGENO + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.STORAGE_DATE + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.GOODS_NAME + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.TOTAL_WEIGHT + "',");
insertBodyBuilder.Append("'" + swStorageMessageList.GOODS_WEIGHT + "')");
}
/// <summary>
/// 构建head表插入SQL语句
/// <author>Asa</author>
/// <createDate>2019/06/8</createDate>
/// </summary>
/// <param name="insertHeadBuilder">构建插入语句的对象</param>
/// <param name="swStorageMessageHead">插入信息实体</param>
public static void BuildHeadInsertSql(StringBuilder insertHeadBuilder, SwStorageMessageHead swStorageMessageHead)
{
insertHeadBuilder.Append("INSERT INTO SW_STORAGE_MESSAGE_HEAD(");
insertHeadBuilder.Append("MSG_ID,MSG_TYPE,CUSTOMS_CODE,SUPV_LOCT_CODE,");
insertHeadBuilder.Append("DECL_DATE,DECLARE_DATE_TYPE,TOTAL_MSG_NO,CUR_MSG_NO) ");
insertHeadBuilder.Append("VALUES('" + swStorageMessageHead.MSG_ID + "',");
insertHeadBuilder.Append("'" + swStorageMessageHead.MSG_TYPE + "',");
insertHeadBuilder.Append("'" + swStorageMessageHead.CUSTOMS_CODE + "',");
insertHeadBuilder.Append("'" + swStorageMessageHead.SUPV_LOCT_CODE + "',");
insertHeadBuilder.Append("to_date('" + swStorageMessageHead.DECL_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),");
insertHeadBuilder.Append("'" + swStorageMessageHead.DECLARE_DATE_TYPE + "',");
insertHeadBuilder.Append("'" + swStorageMessageHead.TOTAL_MSG_NO + "',");
insertHeadBuilder.Append("'" + swStorageMessageHead.CUR_MSG_NO + "')");
}
/// <summary>
/// 构建响应报文表头插入SQL语句
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
/// <param name="insertResponseHeadBuilder">拼接数据插入sql语句StringBuilder对象</param>
/// <param name="swStorageResponseHead">SwStorageResponseHead实体对象</param>
public static void BuildResponseHeadInserSql(StringBuilder insertResponseHeadBuilder, SwStorageResponseHead swStorageResponseHead)
{
insertResponseHeadBuilder.Append("INSERT INTO SW_STORAGE_RESPONSE_HEAD(MSG_ID,");
insertResponseHeadBuilder.Append("MSG_TYPE,CUSTOMS_CODE,SUPV_LOCT_CODE,DECL_DATE) VALUES(");
insertResponseHeadBuilder.Append("'" + swStorageResponseHead.MSG_ID + "',");
insertResponseHeadBuilder.Append("'" + swStorageResponseHead.MSG_TYPE + "',");
insertResponseHeadBuilder.Append("'" + swStorageResponseHead.CUSTOMS_CODE + "',");
insertResponseHeadBuilder.Append("'" + swStorageResponseHead.SUPV_LOCT_CODE + "',");
insertResponseHeadBuilder.Append("to_date('" + swStorageResponseHead.DECL_DATE + "', 'yyyy-MM-dd HH24:mi:ss'))");//("'" + swStorageResponseHead.DECL_DATE + "')");
}
/// <summary>
/// 构建响应报文表体插入SQL语句
/// <author>Asa</author>
/// <createDate>2019/06/20</createDate>
/// </summary>
/// <param name="insertResponseListBuilder">拼接数据插入sql语句StringBuilder对象</param>
/// <param name="swStorageResponseList">SwStorageResponseList实体对象</param>
public static void BuildResponseListInserSql(StringBuilder insertResponseListBuilder, SwStorageResponseList swStorageResponseList)
{
insertResponseListBuilder.Append("INSERT INTO SW_STORAGE_RESPONSE_LIST(MSG_ID,");
insertResponseListBuilder.Append("RESULT,REMARK) VALUES(");
insertResponseListBuilder.Append("'" + swStorageResponseList.MSG_ID + "',");
insertResponseListBuilder.Append("'" + swStorageResponseList.RESULT + "',");
insertResponseListBuilder.Append("'" + swStorageResponseList.REMARK + "')");
}
}
}
代码主要是记录给我自己看的,现在说说我在部署过程中遇到的问题吧:
当我部署上去的时候,启动服务,但是我从FTP下载文件却一直没成功,下载的方法一直报出操作超时,我改了超时时间也没用
想了一下,会不会是FTP的数据端口--20没有开放出来,我用浏览器访问了一下FTP,却又能成功的访问到,排除了这个问题
后来和同事研究了很久,才想到可能是FTP的两种传输模式引起的问题,于是我试了一下,将FTP传输模式()改为了被动式,
果然就能成功下载FTP上的文件了。(早先所有客户端都使用主动模式,而且工作的很好,而现在因为客户端防火墙的存在,将会关闭一些
端口,这样主动模式将会失败。在这种情况下就要使用被动模式,但是一些端口也可能被服务器的防火墙封掉。不过因为ftp服务器需要它的ftp服 务连接到一定数量的客户端,所以他们总是支持被动模式的。这就是我们为什么要使用被动模式的原意,为了确保数据可以正确的传输,使用 被动 模式要明显优于主动模式。)
附上我的FTP工具类,需要的小伙伴可以学习一下:
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
namespace ECI.SW.Common.FTP
{
/// <summary>
/// <author>Asa</author>
/// <createDate>2017-03-07</createDate>
/// <description>FTP工具类</description>
/// </summary>
public class FtpHelper
{
private readonly string _ftpPassword;
private readonly string _ftpServerIp;
private readonly string _ftpUserId;
private string _ftpRemotePath;
private string _ftpUri;
/// <summary>
/// 连接FTP
/// </summary>
/// <param name="ftpServerIp">FTP连接地址</param>
/// <param name="ftpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
public FtpHelper(string ftpServerIp, string ftpRemotePath, string ftpUserId, string ftpPassword)
{
_ftpServerIp = ftpServerIp;
_ftpRemotePath = ftpRemotePath;
_ftpUserId = ftpUserId;
_ftpPassword = ftpPassword;
_ftpUri = "ftp://" + _ftpServerIp + "/" + _ftpRemotePath + "/";
}
/// <summary>
/// 上传
/// </summary>
/// <param name="filename">文件名称(含路径)</param>
public void Upload(string filename)
{
var fileInf = new FileInfo(filename);
var uri = _ftpUri + fileInf.Name;
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
reqFtp.UseBinary = true;
reqFtp.KeepAlive = true;
reqFtp.UsePassive = true;
reqFtp.ContentLength = fileInf.Length;
reqFtp.ReadWriteTimeout = 60000;
reqFtp.Timeout = 60000;
var buffLength = 2048;
var buff = new byte[buffLength];
var fs = fileInf.OpenRead();
try
{
var strm = reqFtp.GetRequestStream();
var contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
}
catch (Exception ex)
{
throw new Exception("Ftphelper Upload Error --> " + ex.Message);
}
}
/// <summary>
/// 上传
/// </summary>
/// <param name="fileInf">提供对客户端已上载的单独文件的访问</param>
public void Upload(HttpPostedFile fileInf)
{
var uri = _ftpUri + fileInf.FileName;
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
reqFtp.UseBinary = true;
reqFtp.UsePassive = false;
reqFtp.ContentLength = fileInf.ContentLength;
var buffLength = 2048;
var buff = new byte[buffLength];
var fs = fileInf.InputStream;
try
{
var strm = reqFtp.GetRequestStream();
var contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
}
catch (Exception ex)
{
throw new Exception("Ftphelper Upload Error --> " + ex.Message);
}
}
/// <summary>
/// 下载
/// </summary>
/// <param name="filePath">保存文件的本地路径</param>
/// <param name="fileName">要下载的文件名</param>
public void Download(string filePath, string fileName)
{
try
{
var outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + fileName));
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
reqFtp.UseBinary = true;
reqFtp.KeepAlive = true;
reqFtp.UsePassive = true;
reqFtp.Timeout = 60000;
reqFtp.ReadWriteTimeout = 60000;
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
var response = (FtpWebResponse)reqFtp.GetResponse();
var ftpStream = response.GetResponseStream();
var cl = response.ContentLength;
var bufferSize = 2048;
var buffer = new byte[bufferSize];
if (ftpStream != null)
{
var readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
}
if (ftpStream != null) ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper Download Error --> " + ex.Message);
}
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">文件名</param>
public void Delete(string fileName)
{
try
{
var uri = _ftpUri + fileName;
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.DeleteFile;
reqFtp.UsePassive = false;
var result = string.Empty;
var response = (FtpWebResponse)reqFtp.GetResponse();
var size = response.ContentLength;
var datastream = response.GetResponseStream();
if (datastream != null)
{
var sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
}
if (datastream != null) datastream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper Delete Error --> " + ex.Message + " 文件名:" + fileName);
}
}
/// <summary>
/// 删除文件夹
/// </summary>
/// <param name="folderName">文件夹名称</param>
public void RemoveDirectory(string folderName)
{
try
{
var uri = _ftpUri + folderName;
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
reqFtp.KeepAlive = false;
reqFtp.Method = WebRequestMethods.Ftp.RemoveDirectory;
reqFtp.UsePassive = false;
var result = string.Empty;
var response = (FtpWebResponse)reqFtp.GetResponse();
var size = response.ContentLength;
var datastream = response.GetResponseStream();
if (datastream != null)
{
var sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
}
if (datastream != null) datastream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper Delete Error --> " + ex.Message + " 文件名:" + folderName);
}
}
/// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
/// <returns></returns>
public string[] GetFilesDetailList()
{
try
{
var result = new StringBuilder();
var ftp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri));
ftp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
ftp.UsePassive = false;
var response = ftp.GetResponse();
var reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
var line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
//downloadFiles = null;
throw new Exception("FtpHelper Error --> " + ex.Message);
}
}
/// <summary>
/// 获取当前目录下文件列表(仅文件)
/// </summary>
/// <returns></returns>
public string[] GetFileList(string mask)
{
var result = new StringBuilder();
try
{
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
reqFtp.KeepAlive = true;
reqFtp.UsePassive = true;
reqFtp.Timeout = 60000;
var response = reqFtp.GetResponse();
var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
var line = reader.ReadLine();
while (line != null)
{
if ((mask.Trim() != string.Empty) && (mask.Trim() != "*.*"))
{
var mask_ = mask.Substring(0, mask.IndexOf("*"));
if (line.Substring(0, mask_.Length) == mask_)
{
result.Append(line);
result.Append("\n");
}
}
else
{
result.Append(line);
result.Append("\n");
}
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
throw new Exception("FtpHelper GetFileList Error --> " + ex.Message);
return null;
}
}
/// <summary>
/// 获取当前目录下所有的文件夹列表(仅文件夹)
/// </summary>
/// <returns></returns>
public string[] GetDirectoryList()
{
var drectory = GetFilesDetailList();
var m = string.Empty;
foreach (var str in drectory)
{
var dirPos = str.IndexOf("<DIR>");
if (dirPos > 0)
{
/*判断 Windows 风格*/
m += str.Substring(dirPos + 5).Trim() + "\n";
}
else if (str.Trim().Substring(0, 1).ToUpper() == "D")
{
/*判断 Unix 风格*/
var dir = str.Substring(54).Trim();
if ((dir != ".") && (dir != ".."))
m += dir + "\n";
}
}
char[] n = { '\n' };
return m.Split(n);
}
/// <summary>
/// 判断当前目录下指定的子目录是否存在
/// </summary>
/// <param name="remoteDirectoryName">指定的目录名</param>
public bool DirectoryExist(string remoteDirectoryName)
{
var dirList = GetDirectoryList();
foreach (var str in dirList)
if (str.Trim() == remoteDirectoryName.Trim())
return true;
return false;
}
/// <summary>
/// 判断当前目录下指定的文件是否存在
/// </summary>
/// <param name="remoteFileName">远程文件名</param>
public bool FileExist(string remoteFileName)
{
var fileList = GetFileList("*.*");
foreach (var str in fileList)
if (str.Trim() == remoteFileName.Trim())
return true;
return false;
}
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name="dirName"></param>
public void MakeDir(string dirName)
{
try
{
// dirName = name of the directory to create.
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + dirName));
reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFtp.UseBinary = true;
reqFtp.UsePassive = false;
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
var response = (FtpWebResponse)reqFtp.GetResponse();
var ftpStream = response.GetResponseStream();
if (ftpStream != null) ftpStream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper MakeDir Error --> " + ex.Message);
}
}
/// <summary>
/// 获取指定文件大小
/// </summary>
/// <param name="filename">文件名称</param>
/// <returns></returns>
public long GetFileSize(string filename)
{
long fileSize = 0;
try
{
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + filename));
reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
reqFtp.UseBinary = true;
reqFtp.UsePassive = false;
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
var response = (FtpWebResponse)reqFtp.GetResponse();
var ftpStream = response.GetResponseStream();
fileSize = response.ContentLength;
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper GetFileSize Error --> " + ex.Message);
}
return fileSize;
}
/// <summary>
/// 改名
/// </summary>
/// <param name="currentFilename">当前文件名</param>
/// <param name="newFilename">新文件名</param>
public void ReName(string currentFilename, string newFilename)
{
try
{
var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + currentFilename));
reqFtp.Method = WebRequestMethods.Ftp.Rename;
reqFtp.RenameTo = newFilename;
reqFtp.UseBinary = true;
reqFtp.UsePassive = false;
reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
var response = (FtpWebResponse)reqFtp.GetResponse();
var ftpStream = response.GetResponseStream();
if (ftpStream != null) ftpStream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception("FtpHelper ReName Error --> " + ex.Message);
}
}
/// <summary>
/// 移动文件
/// </summary>
/// <param name="currentFilename">当前文件名</param>
/// <param name="newDirectory">新文件夹</param>
public void MovieFile(string currentFilename, string newDirectory)
{
ReName(currentFilename, newDirectory);
}
/// <summary>
/// 切换当前目录
/// </summary>
/// <param name="directoryName">文件夹名称</param>
/// <param name="isRoot">true 绝对路径 false 相对路径</param>
public void GotoDirectory(string directoryName, bool isRoot)
{
if (isRoot)
_ftpRemotePath = directoryName;
else
_ftpRemotePath += directoryName + "/";
_ftpUri = "ftp://" + _ftpServerIp + "/" + _ftpRemotePath + "/";
}
}
}
50010702506256