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(); } } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?