C# 操作FTP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using System.IO;
using System.Net;
using FluentFTP;
using Oracle.ManagedDataAccess.Client;
using System.Linq;
using FluentFTP.Helpers;
 
namespace FtpToOracleConsoleApp
{
class Program
{
static void Main(string[] args)
{
string ftpServerUri = "ftp://888.88.88.88";
string ftpUsername = "a";
string ftpPassword = "b";
string oracleConnectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=90.32.15.55)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=report)));User Id=sa;Password=abc;";
 
ProcessDirectory(ftpServerUri, ftpUsername, ftpPassword, oracleConnectionString);
}
 
static void ProcessDirectory(string directoryUri, string ftpUsername, string ftpPassword, string oracleConnectionString)
{
FtpWebRequest directoryRequest = (FtpWebRequest)WebRequest.Create(directoryUri);
directoryRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
directoryRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
 
FtpWebResponse directoryResponse = (FtpWebResponse)directoryRequest.GetResponse();
Stream responseStream = directoryResponse.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
 
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (!string.IsNullOrEmpty(line))
{
string name = ParseFileNameFromFtpResponse(line);
bool isDirectory = CheckIfDirectory(line);
 
if (isDirectory)
{
string newUri = directoryUri.TrimEnd('/') + "/" + name;
ProcessDirectory(newUri, ftpUsername, ftpPassword, oracleConnectionString);
}
else
{
if (!string.IsNullOrEmpty(line) && line.EndsWith(".txt"))
{
DateTime modifiedTime = ParseModifiedTime(line);
//查询24小时内的文件
if ((DateTime.Now - modifiedTime).TotalHours <= 24)
{
var parts = name.Split(new char[] { '_', '[', ']' });
 
// 提取 prodId (第一部分)
string prodId = parts[0];
 
// 提取 lotId 并替换其中的 _ 为 #
string lotId = parts[1] + "#" + parts[2].Split(new char[] { 'S' })[1];
 
// 提取并转换 dieCount
int dieCount = int.Parse(parts[4]);
 
InsertIntoOracle(oracleConnectionString, prodId, lotId, dieCount);
}
}
}
}
}
reader.Close();
directoryResponse.Close();
}
 
static bool CheckIfDirectory(string ftpResponseLine)
{
// 根据FTP服务器的响应格式判断是否为目录
// 这是一个简化的示例,可能需要根据实际情况进行调整
return ftpResponseLine.StartsWith("d");
}
 
static string ParseFileNameFromFtpResponse(string ftpResponseLine)
{
// FTP响应的格式可能因FTP服务器而异,这里是一个通用的解析方法
// 通常文件名是在行的末尾,且前面有一些空格分隔的字段
var parts = ftpResponseLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
return parts[parts.Length - 1];
}
 
static DateTime ParseModifiedTime(string ftpResponseLine)
{
// 根据FTP服务器的响应格式解析修改时间
// 示例仅作为示意,可能需要调整
var parts = ftpResponseLine.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int currentYear = DateTime.Now.Year;
int currentMonth = DateTime.Now.Month;
 
// 构建完整的日期时间字符串
string fullDateTimeStr = $"{currentYear}-{currentMonth}-{parts[6]} {parts[7]}";
 
// 定义日期时间的格式
string format = "yyyy-M-dd HH:mm";
 
if (DateTime.TryParseExact(fullDateTimeStr, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime parsedDateTime))
{
return parsedDateTime;
}
else
{
throw new FormatException("Invalid date time format.");
}
}
 
static void InsertIntoOracle(string connectionString, string prodId,string lotId, int dieCount)
{
using (OracleConnection conn = new OracleConnection(connectionString))
{
conn.Open();
 
// 检查记录是否存在
string checkSql = "SELECT dieCount FROM your_table WHERE prodId = :prodId AND lotId = :lotId";
OracleCommand checkCmd = new OracleCommand(checkSql, conn);
checkCmd.Parameters.Add(new OracleParameter("prodId", prodId));
checkCmd.Parameters.Add(new OracleParameter("lotId", lotId));
 
object result = checkCmd.ExecuteScalar();
 
if (result != null && result != DBNull.Value)
{
// 记录存在
int existingDieCount = Convert.ToInt32(result);
 
if (existingDieCount == 0)
{
// dieCount 为空,更新记录
string updateSql = "UPDATE your_table SET dieCount = :dieCount WHERE prodId = :prodId AND lotId = :lotId";
OracleCommand updateCmd = new OracleCommand(updateSql, conn);
updateCmd.Parameters.Add(new OracleParameter("dieCount", dieCount));
updateCmd.Parameters.Add(new OracleParameter("prodId", prodId));
updateCmd.Parameters.Add(new OracleParameter("lotId", lotId));
 
updateCmd.ExecuteNonQuery();
}
// 如果 dieCount 不为空,则不执行任何操作
}
else
{
// 记录不存在,插入新记录
string insertSql = "INSERT INTO your_table (prodId, lotId, dieCount) VALUES (:prodId, :lotId, :dieCount)";
OracleCommand insertCmd = new OracleCommand(insertSql, conn);
insertCmd.Parameters.Add(new OracleParameter("prodId", prodId));
insertCmd.Parameters.Add(new OracleParameter("lotId", lotId));
insertCmd.Parameters.Add(new OracleParameter("dieCount", dieCount));
 
insertCmd.ExecuteNonQuery();
}
}
}
}
}

  

posted @   烈火寒冰  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示