c# ftp创建文件(非上传文件)
c# ftp创建文件(非上传文件)
一.奇葩的故事:
今天项目中遇到这么个奇葩的问题,ftp文件传输完成后要在ftp目录下另一个文件夹下创建对应的空文件,听说是为了文件的完整性,既然这么说,那么就必须这么干,员工服从领导是员工的天职,一来二去,思路有了。两个方案:1.通过ftp创建文件;2.本地创建然后在传输过去。开始觉得ftp创建文件不太好整,毕竟要在远程电脑上创建文件,应该是不被允许的把。所以只能使用另一种方案了,在本地创建文件然后在通过ftp传过去不就行了么,说干就干。主要是项目更改不大,就这么干了。(白干了)然而,遇到奇葩的问题了,传过去后还要修改文件名,还没来的及修改被迁移程序迁走了,还没来的及修改就被迁移了,所以文件名不符合要求了,这都是小事,主要是后面的程序不能执行,传输程序报错,同步程序报错,真所谓的牵一发而动全身。所以,上面说的白干了就是这么个意思。既然遇到问题,就得解决呗,说着只能回到之前的思路上了。那么就只能通过第一种方案了,通过ftp创建文件。网上找了个ftpHelper但是看了确实没有创建文件的函数,但细细看来,和上传文件挺类似的,那么就有了下面的故事。
二.FTPHelper类库:

1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Net; 6 using System.Text; 7 using System.Text.RegularExpressions; 8 9 namespace FTP_Demo 10 { 11 /// <summary> 12 /// FTP帮助类 13 /// </summary> 14 public class FTPHelper 15 { 16 #region 字段 17 string ftpURI; 18 string ftpUserID; 19 string ftpServerIP; 20 string ftpPassword; 21 string ftpRemotePath; 22 #endregion 23 24 /// <summary> 25 /// 连接FTP服务器 26 /// </summary> 27 /// <param name="FtpServerIP">FTP连接地址</param> 28 /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> 29 /// <param name="FtpUserID">用户名</param> 30 /// <param name="FtpPassword">密码</param> 31 public FTPHelper(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword) 32 { 33 ftpServerIP = FtpServerIP; 34 ftpRemotePath = FtpRemotePath; 35 ftpUserID = FtpUserID; 36 ftpPassword = FtpPassword; 37 ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; 38 } 39 40 /// <summary> 41 /// 上传 42 /// </summary> 43 public void Upload(string filename) 44 { 45 FileInfo fileInf = new FileInfo(filename); 46 FtpWebRequest reqFTP; 47 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileInf.Name)); 48 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 49 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 50 reqFTP.KeepAlive = false; 51 reqFTP.UseBinary = true; 52 reqFTP.ContentLength = fileInf.Length; 53 int buffLength = 2048; 54 byte[] buff = new byte[buffLength]; 55 int contentLen; 56 FileStream fs = fileInf.OpenRead(); 57 try 58 { 59 Stream strm = reqFTP.GetRequestStream(); 60 contentLen = fs.Read(buff, 0, buffLength); 61 while (contentLen != 0) 62 { 63 strm.Write(buff, 0, contentLen); 64 contentLen = fs.Read(buff, 0, buffLength); 65 } 66 strm.Close(); 67 fs.Close(); 68 } 69 catch (Exception ex) 70 { 71 throw new Exception(ex.Message); 72 } 73 } 74 75 /// <summary> 76 /// 下载 77 /// </summary> 78 public void Download(string filePath, string fileName) 79 { 80 try 81 { 82 FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); 83 FtpWebRequest reqFTP; 84 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName)); 85 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 86 reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; 87 reqFTP.UseBinary = true; 88 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 89 Stream ftpStream = response.GetResponseStream(); 90 long cl = response.ContentLength; 91 int bufferSize = 2048; 92 int readCount; 93 byte[] buffer = new byte[bufferSize]; 94 readCount = ftpStream.Read(buffer, 0, bufferSize); 95 while (readCount > 0) 96 { 97 outputStream.Write(buffer, 0, readCount); 98 readCount = ftpStream.Read(buffer, 0, bufferSize); 99 } 100 ftpStream.Close(); 101 outputStream.Close(); 102 response.Close(); 103 } 104 catch (Exception ex) 105 { 106 throw new Exception(ex.Message); 107 } 108 } 109 110 /// <summary> 111 /// 删除文件 112 /// </summary> 113 public void Delete(string fileName) 114 { 115 try 116 { 117 FtpWebRequest reqFTP; 118 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName)); 119 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 120 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile; 121 reqFTP.KeepAlive = false; 122 string result = String.Empty; 123 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 124 long size = response.ContentLength; 125 Stream datastream = response.GetResponseStream(); 126 StreamReader sr = new StreamReader(datastream); 127 result = sr.ReadToEnd(); 128 sr.Close(); 129 datastream.Close(); 130 response.Close(); 131 } 132 catch (Exception ex) 133 { 134 throw new Exception(ex.Message); 135 } 136 } 137 138 /// <summary> 139 /// 获取当前目录下明细(包含文件和文件夹) 140 /// </summary> 141 public string[] GetFilesDetailList() 142 { 143 try 144 { 145 StringBuilder result = new StringBuilder(); 146 FtpWebRequest ftp; 147 ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI)); 148 ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 149 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 150 WebResponse response = ftp.GetResponse(); 151 StreamReader reader = new StreamReader(response.GetResponseStream()); 152 string line = reader.ReadLine(); 153 line = reader.ReadLine(); 154 line = reader.ReadLine(); 155 while (line != null) 156 { 157 result.Append(line); 158 result.Append("\n"); 159 line = reader.ReadLine(); 160 } 161 result.Remove(result.ToString().LastIndexOf("\n"), 1); 162 reader.Close(); 163 response.Close(); 164 return result.ToString().Split('\n'); 165 } 166 catch (Exception ex) 167 { 168 throw new Exception(ex.Message); 169 } 170 } 171 172 /// <summary> 173 /// 获取FTP文件列表(包括文件夹) 174 /// </summary> 175 private string[] GetAllList(string url) 176 { 177 List<string> list = new List<string>(); 178 FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(url)); 179 req.Credentials = new NetworkCredential(ftpPassword, ftpPassword); 180 req.Method = WebRequestMethods.Ftp.ListDirectory; 181 req.UseBinary = true; 182 req.UsePassive = true; 183 try 184 { 185 using (FtpWebResponse res = (FtpWebResponse)req.GetResponse()) 186 { 187 using (StreamReader sr = new StreamReader(res.GetResponseStream())) 188 { 189 string s; 190 while ((s = sr.ReadLine()) != null) 191 { 192 list.Add(s); 193 } 194 } 195 } 196 } 197 catch (Exception ex) 198 { 199 throw (ex); 200 } 201 return list.ToArray(); 202 } 203 204 /// <summary> 205 /// 获取当前目录下文件列表(不包括文件夹) 206 /// </summary> 207 public string[] GetFileList(string url) 208 { 209 StringBuilder result = new StringBuilder(); 210 FtpWebRequest reqFTP; 211 try 212 { 213 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url)); 214 reqFTP.UseBinary = true; 215 reqFTP.Credentials = new NetworkCredential(ftpPassword, ftpPassword); 216 reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 217 WebResponse response = reqFTP.GetResponse(); 218 StreamReader reader = new StreamReader(response.GetResponseStream()); 219 string line = reader.ReadLine(); 220 while (line != null) 221 { 222 223 if (line.IndexOf("<DIR>") == -1) 224 { 225 result.Append(Regex.Match(line, @"[\S]+ [\S]+", RegexOptions.IgnoreCase).Value.Split(' ')[1]); 226 result.Append("\n"); 227 } 228 line = reader.ReadLine(); 229 } 230 result.Remove(result.ToString().LastIndexOf('\n'), 1); 231 reader.Close(); 232 response.Close(); 233 } 234 catch (Exception ex) 235 { 236 throw (ex); 237 } 238 return result.ToString().Split('\n'); 239 } 240 241 /// <summary> 242 /// 判断当前目录下指定的文件是否存在 243 /// </summary> 244 /// <param name="RemoteFileName">远程文件名</param> 245 public bool FileExist(string RemoteFileName) 246 { 247 string[] fileList = GetFileList("*.*"); 248 foreach (string str in fileList) 249 { 250 if (str.Trim() == RemoteFileName.Trim()) 251 { 252 return true; 253 } 254 } 255 return false; 256 } 257 258 /// <summary> 259 /// 创建文件夹 260 /// </summary> 261 public void MakeDir(string dirName) 262 { 263 FtpWebRequest reqFTP; 264 try 265 { 266 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName)); 267 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory; 268 reqFTP.UseBinary = true; 269 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 270 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 271 Stream ftpStream = response.GetResponseStream(); 272 ftpStream.Close(); 273 response.Close(); 274 } 275 catch (Exception ex) 276 { } 277 } 278 279 /// <summary> 280 /// 获取指定文件大小 281 /// </summary> 282 public long GetFileSize(string filename) 283 { 284 FtpWebRequest reqFTP; 285 long fileSize = 0; 286 try 287 { 288 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename)); 289 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; 290 reqFTP.UseBinary = true; 291 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 292 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 293 Stream ftpStream = response.GetResponseStream(); 294 fileSize = response.ContentLength; 295 ftpStream.Close(); 296 response.Close(); 297 } 298 catch (Exception ex) 299 { } 300 return fileSize; 301 } 302 303 /// <summary> 304 /// 更改文件名 305 /// </summary> 306 public void ReName(string currentFilename, string newFilename) 307 { 308 FtpWebRequest reqFTP; 309 try 310 { 311 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename)); 312 reqFTP.Method = WebRequestMethods.Ftp.Rename; 313 reqFTP.RenameTo = newFilename; 314 reqFTP.UseBinary = true; 315 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 316 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); 317 Stream ftpStream = response.GetResponseStream(); 318 ftpStream.Close(); 319 response.Close(); 320 } 321 catch (Exception ex) 322 { } 323 } 324 325 /// <summary> 326 /// 移动文件 327 /// </summary> 328 public void MovieFile(string currentFilename, string newDirectory) 329 { 330 ReName(currentFilename, newDirectory); 331 } 332 333 /// <summary> 334 /// 切换当前目录 335 /// </summary> 336 /// <param name="IsRoot">true:绝对路径 false:相对路径</param> 337 public void GotoDirectory(string DirectoryName, bool IsRoot) 338 { 339 if (IsRoot) 340 { 341 ftpRemotePath = DirectoryName; 342 } 343 else 344 { 345 ftpRemotePath += DirectoryName + "/"; 346 } 347 ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/"; 348 } 349 350 /// <summary> 351 /// 创建文件 352 /// </summary> 353 /// <param name="filename">文件名</param> 354 /// <param name="text">内容</param> 355 public void CreateFile(string filename, string text) 356 { 357 int bufferLength = 1024; 358 byte[] buffer = new byte[bufferLength]; 359 FtpWebRequest reqFTP; 360 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename)); 361 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 362 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 363 reqFTP.KeepAlive = false; 364 reqFTP.UseBinary = true; 365 reqFTP.ContentLength = text.Length; 366 buffer = Encoding.Unicode.GetBytes(text); 367 using (Stream stream = reqFTP.GetRequestStream()) 368 { 369 int count = buffer.Length; 370 while (count > 0) 371 { 372 if (buffer.Length < bufferLength) 373 { 374 bufferLength = buffer.Length; 375 } 376 stream.Write(buffer, 0, bufferLength); 377 count = count - bufferLength; 378 } 379 } 380 } 381 } 382 }
三.定义ftp创建文件函数:
1 /// <summary> 2 /// 创建文件 3 /// </summary> 4 /// <param name="filename">文件名</param> 5 /// <param name="text">内容</param> 6 public void CreateFile(string filename, string text) 7 { 8 int bufferLength = 1024; 9 byte[] buffer = new byte[bufferLength]; 10 FtpWebRequest reqFTP; 11 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename)); 12 reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 13 reqFTP.Method = WebRequestMethods.Ftp.UploadFile; 14 reqFTP.KeepAlive = false; 15 reqFTP.UseBinary = true; 16 reqFTP.ContentLength = text.Length; 17 buffer = Encoding.Unicode.GetBytes(text); 18 using (Stream stream = reqFTP.GetRequestStream()) 19 { 20 int count = buffer.Length; 21 while (count > 0) 22 { 23 if (buffer.Length < bufferLength) 24 { 25 bufferLength = buffer.Length; 26 } 27 stream.Write(buffer, 0, bufferLength); 28 count = count - bufferLength; 29 } 30 } 31 }
四.注意:
stream.Write(buffer, 0, bufferLength);
由于内容的长度有可能小于 bufferLength,所以做了如上if处理。(在这里被坑过了,提示一下而已!)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构