1 using System; 2 using System.Collections.Generic; 3 using System.Data.OleDb; 4 using System.IO; 5 using System.Linq; 6 using System.Net; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace GateProject 11 { 12 public class FtpUpDown 13 { 14 private string strFtpServerIP; 15 16 private string strFtpUserId; 17 18 private string strFtpPassword; 19 20 private string strFtpPort="21"; 21 22 private FtpWebRequest objReqFtp = null; 23 24 /// <summary> 25 /// 连接ftp 26 /// </summary> 27 /// <param name="path"></param> 28 private void Connect(String path) 29 { 30 31 // 根据uri创建FtpWebRequest对象 32 objReqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); 33 34 // 指定数据传输类型 35 //To transmit text data, change the UseBinary property from its default value ( true) to false. 36 objReqFtp.UseBinary = true; 37 38 // specifies that an SSL connection 39 objReqFtp.EnableSsl = false; 40 41 // ftp用户名和密码 42 objReqFtp.Credentials = new NetworkCredential(strFtpUserId, strFtpPassword); 43 44 } 45 46 /// <summary> 47 /// 初始化 48 /// </summary> 49 /// <param name="strFtpServerIp"></param> 50 /// <param name="strFtpUserId"></param> 51 /// <param name="strFtpPassword"></param> 52 public FtpUpDown() 53 { 54 55 try 56 { 57 //获取ftp服务器连接凭证 58 //此处省略一些代码 66 this.strFtpServerIP = Credentials[0]; 67 this.strFtpUserId = Credentials[1]; 68 this.strFtpPassword = Credentials[2]; 69 75 } 76 catch (Exception ee) 77 { 78 MessageBox.Show("连接ftp服务器失败!/r/n"+ee.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); 79 } 80 81 } 82 83 /// <summary> 84 /// 从ftp服务器上获得文件列表 85 /// </summary> 86 /// <param name="path"></param> 87 /// <param name="WRMethods"></param> 88 /// <returns></returns> 89 private string[] GetFileList(string path, string WRMethods) 90 { 91 string[] downloadFiles; 92 StringBuilder result = new StringBuilder(); 93 Encoding pEncoding = Encoding.Default; 94 try 95 { 96 Connect(path); 97 98 objReqFtp.Method = WRMethods; 99 100 WebResponse response = objReqFtp.GetResponse(); 101 102 StreamReader readStream; 103 104 pEncoding = GetEncodingEncode(response); 105 106 readStream = new StreamReader(response.GetResponseStream(), pEncoding);//中文文件名 107 //readStream = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); 108 string line = readStream.ReadLine(); 109 110 while (line != null) 111 { 112 result.Append(line); 113 114 result.Append("\n"); 115 116 line = readStream.ReadLine(); 117 118 } 119 120 // to remove the trailing '\n' 121 122 result.Remove(result.ToString().LastIndexOf('\n'), 1); 123 124 readStream.Close(); 125 126 response.Close(); 127 128 objReqFtp = null; 129 130 return result.ToString().Split('\n'); 131 132 } 133 134 catch (Exception ex) 135 136 { 137 MessageBox.Show(ex.Message); 138 139 downloadFiles = null; 140 141 return downloadFiles; 142 } 143 } 144 /// <summary> 145 /// 获取编码方式 146 /// </summary> 147 /// <param name="response"></param> 148 /// <returns></returns> 149 private static Encoding GetEncodingEncode(WebResponse response) 150 { 151 Encoding encodingTemp=Encoding.Default; 152 153 StreamReader reader = new StreamReader(response.GetResponseStream()); 154 155 encodingTemp = reader.CurrentEncoding; 156 157 if (encodingTemp == Encoding.UTF8) 158 { 159 encodingTemp = Encoding.UTF8; 160 } 161 else if(encodingTemp == Encoding.Default) 162 { 163 encodingTemp = Encoding.GetEncoding("GB2312"); 164 } 165 else 166 { 167 168 } 169 170 return encodingTemp; 171 } 172 173 /// <summary> 174 /// 从ftp服务器上获得特定路径中文件列表 175 /// </summary> 176 /// <param name="path"></param> 177 /// <returns></returns> 178 public string[] GetFileList(string path) 179 { 180 return GetFileList("ftp://" + strFtpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory); 181 } 182 183 /// <summary> 184 /// 获取ftp服务器文件列表 185 /// </summary> 186 /// <returns></returns> 187 public string[] GetFileList() 188 { 189 return GetFileList("ftp://" + strFtpServerIP + "/", WebRequestMethods.Ftp.ListDirectory); 190 } 191 192 /// <summary> 193 /// 向ftp服务器上载文件 194 /// </summary> 195 /// <param name="filename">文件名</param> 196 /// <param name="targetPath">目标文件上载路径,不含IP地址</param> 197 public void Upload(string filename,string targetPath) 198 { 199 FileInfo fileInf = new FileInfo(filename); 200 201 string uri = "ftp://" + strFtpServerIP + ":" + strFtpPort + "/" + targetPath ; 202 203 Connect(uri);//连接 204 205 // 默认为true,连接不会被关闭 206 207 // 在一个命令之后被执行 208 209 objReqFtp.KeepAlive = false; 210 211 // 指定执行什么命令 212 213 objReqFtp.Method = WebRequestMethods.Ftp.UploadFile; 214 215 // 上传文件时通知服务器文件的大小 216 217 objReqFtp.ContentLength = fileInf.Length; 218 // 缓冲大小设置为kb 219 int buffLength = 2048; 220 byte[] buff = new byte[buffLength]; 221 222 int contentLen; 223 224 // 打开一个文件流(System.IO.FileStream) 去读上传的文件 225 226 FileStream fs = fileInf.OpenRead(); 227 228 try 229 230 { 231 232 // 把上传的文件写入流 233 Stream strm = objReqFtp.GetRequestStream(); 234 235 // 每次读文件流的kb 236 contentLen = fs.Read(buff, 0, buffLength); 237 238 // 流内容没有结束 239 while (contentLen != 0) 240 { 241 // 把内容从file stream 写入upload stream 242 strm.Write(buff, 0, contentLen); 243 contentLen = fs.Read(buff, 0, buffLength); 244 245 } 246 247 // 关闭两个流 248 strm.Close(); 249 fs.Close(); 250 objReqFtp = null; 251 252 } 253 catch (Exception ex) 254 { 255 256 MessageBox.Show(ex.Message, "Upload Error"); 257 258 } 259 260 } 261 262 /// <summary> 263 /// 从ftp服务器下载文件 264 /// </summary> 265 /// <param name="filePath"></param> 266 /// <param name="fileName"></param> 267 /// <param name="errorinfo"></param> 268 /// <returns></returns> 269 public bool Download(string filePath, string fileName, out string errorinfo) 270 { 271 try 272 { 273 String onlyFileName = Path.GetFileName(fileName); 274 275 string newFileName = filePath + "\\" + onlyFileName; 276 277 if (File.Exists(newFileName)) 278 { 279 errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName); 280 return false; 281 } 282 string url = "ftp://" + strFtpServerIP + ":" + strFtpPort + fileName; 283 Connect(url);//连接 284 objReqFtp.Credentials = new NetworkCredential(strFtpUserId, strFtpPassword); 285 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 286 Stream ftpStream = response.GetResponseStream(); 287 long cl = response.ContentLength; 288 int bufferSize = 2048; 289 int readCount; 290 byte[] buffer = new byte[bufferSize]; 291 readCount = ftpStream.Read(buffer, 0, bufferSize); 292 293 FileStream outputStream = new FileStream(newFileName, FileMode.Create); 294 295 while (readCount > 0) 296 { 297 outputStream.Write(buffer, 0, readCount); 298 readCount = ftpStream.Read(buffer, 0, bufferSize); 299 } 300 ftpStream.Close(); 301 outputStream.Close(); 302 response.Close(); 303 304 objReqFtp = null; 305 errorinfo = outputStream.Name; 306 return true; 307 308 } 309 catch (Exception ex) 310 { 311 errorinfo = string.Format("因{0},无法下载", ex.Message); 312 return false; 313 } 314 315 } 316 317 /// <summary> 318 /// 检测目录是否存在 319 /// </summary> 320 /// <param name="ftpFilePath"></param> 321 /// <returns>false不存在,true存在</returns> 322 public bool DirectoryIsExist(string ftpFilePath) 323 { 324 WebResponse webResponse=null; 325 StreamReader reader=null; 326 try 327 { 328 int s = ftpFilePath.LastIndexOf('/'); 329 if (s == ftpFilePath.Length - 1) 330 { 331 ftpFilePath = ftpFilePath.Substring(0, ftpFilePath.Length - 1); 332 s = ftpFilePath.LastIndexOf('/'); 333 } 334 string ftpFileName = ftpFilePath.Substring(s + 1, ftpFilePath.Length - s - 1); 335 string uri = GetFtpUri(ftpFilePath.Substring(0, s + 1)); 336 337 Connect(uri); 338 339 objReqFtp.Method = WebRequestMethods.Ftp.ListDirectory; 340 objReqFtp.UsePassive = false; 341 objReqFtp.KeepAlive = false; 342 343 webResponse = objReqFtp.GetResponse(); 344 reader = new StreamReader(webResponse.GetResponseStream()); 345 string line = reader.ReadLine(); 346 while (line != null) 347 { 348 if (line == ftpFileName) 349 { 350 return true; 351 } 352 line = reader.ReadLine(); 353 } 354 } 355 catch (Exception e) 356 { 357 return false; 358 } 359 finally 360 { 361 if (reader != null) 362 { 363 reader.Close(); 364 } 365 if (webResponse != null) 366 { 367 webResponse.Close(); 368 } 369 370 objReqFtp = null; 371 } 372 return false; 373 } 374 375 /// <summary> 376 /// 377 /// </summary> 378 /// <param name="substring"></param> 379 /// <returns></returns> 380 private string GetFtpUri(string substring) 381 { 382 string uri = "ftp://" + strFtpServerIP + ":" + strFtpPort + "/" + substring; 383 return uri; 384 } 385 386 387 /// <summary> 388 /// 删除文件 389 /// </summary> 390 /// <param name="fileName"></param> 391 public bool DeleteFileName(string fileName) 392 { 393 try 394 { 395 FileInfo fileInf = new FileInfo(fileName); 396 397 string uri = "ftp://" + strFtpServerIP + ":" + strFtpPort + fileName; 398 399 Connect(uri);//连接 400 401 // 默认为true,连接不会被关闭 402 403 // 在一个命令之后被执行 404 405 objReqFtp.KeepAlive = false; 406 407 // 指定执行什么命令 408 409 objReqFtp.Method = WebRequestMethods.Ftp.DeleteFile; 410 411 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 412 413 bool success = response.StatusCode == FtpStatusCode.CommandOK || response.StatusCode == FtpStatusCode.FileActionOK; 414 415 response.Close(); 416 417 objReqFtp = null; 418 419 return success; 420 421 } 422 catch (Exception ex) 423 { 424 MessageBox.Show(ex.Message, "删除错误"); 425 return false; 426 } 427 428 } 429 430 /// <summary> 431 /// 创建目录 432 /// </summary> 433 /// <param name="dirName">目录名称,不包括IP</param> 434 public void MakeDir(string dirName) 435 { 436 try 437 { 438 string uri = "ftp://" + strFtpServerIP + "/" + dirName; 439 440 Connect(uri);//连接 441 442 objReqFtp.Method = WebRequestMethods.Ftp.MakeDirectory; 443 444 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 445 446 response.Close(); 447 448 objReqFtp = null; 449 450 } 451 catch (Exception ex) 452 { 453 MessageBox.Show(ex.Message); 454 } 455 456 } 457 458 /// <summary> 459 /// 删除目录 460 /// </summary> 461 /// <param name="dirName"></param> 462 public void DelDir(string dirName) 463 { 464 try 465 { 466 string uri = "ftp://" + strFtpServerIP +":"+strFtpPort + dirName; 467 468 Connect(uri);//连接 469 470 objReqFtp.Method = WebRequestMethods.Ftp.RemoveDirectory; 471 472 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 473 474 response.Close(); 475 476 objReqFtp = null; 477 478 } 479 catch (Exception ex) 480 { 481 MessageBox.Show(ex.Message); 482 } 483 484 } 485 486 /// <summary> 487 /// 获得文件大小 488 /// </summary> 489 /// <param name="filename"></param> 490 /// <returns></returns> 491 public long GetFileSize(string filename) 492 { 493 long fileSize = 0; 494 try 495 { 496 FileInfo fileInf = new FileInfo(filename); 497 498 string uri = "ftp://" + strFtpServerIP + "/" + fileInf.Name; 499 500 Connect(uri);//连接 501 502 objReqFtp.Method = WebRequestMethods.Ftp.GetFileSize; 503 504 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 505 506 fileSize = response.ContentLength; 507 508 response.Close(); 509 510 objReqFtp = null; 511 } 512 catch (Exception ex) 513 { 514 MessageBox.Show(ex.Message); 515 } 516 517 return fileSize; 518 519 } 520 521 /// <summary> 522 /// 文件重命名,包括ftp服务器内移动,但目标目录若已有同名文件,则会发生错误,原文件会被删除 523 /// 524 /// </summary> 525 /// <param name="currentFilename">当前目录[不含IP]</param> 526 /// <param name="newFilename">新目录[不含IP]</param> 527 public bool Rename(string currentFilename, string newFilename) 528 { 529 try 530 { 531 FileInfo fileInf = new FileInfo(currentFilename); 532 533 string uri = "ftp://" + strFtpServerIP + ":" + strFtpPort + currentFilename; 534 535 Connect(uri);//连接 536 537 objReqFtp.Method = System.Net.WebRequestMethods.Ftp.Rename; 538 //Wr.RenameTo = "/"+"someotherDirectory" + "/" +"file.txt"; 539 objReqFtp.RenameTo = newFilename; 540 541 FtpWebResponse response = (FtpWebResponse)objReqFtp.GetResponse(); 542 543 Stream ftpStream = response.GetResponseStream(); 544 545 if (ftpStream != null) ftpStream.Close(); 546 547 bool success = response.StatusCode == FtpStatusCode.CommandOK || response.StatusCode == FtpStatusCode.FileActionOK; 548 549 response.Close(); 550 551 objReqFtp = null; 552 553 return success; 554 } 555 556 catch (Exception ex) 557 558 { 559 560 MessageBox.Show(ex.Message); 561 return false; 562 563 } 564 565 } 566 567 /// <summary> 568 /// 获得文件明细 569 /// </summary> 570 /// <returns></returns> 571 public string[] GetFilesDetailList() 572 { 573 return GetFileList("ftp://" + strFtpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails); 574 } 575 576 /// <summary> 577 /// 获得特定路径下的文件明细 578 /// </summary> 579 /// <param name="path"></param> 580 /// <returns></returns> 581 public string[] GetFilesDetailList(string path) 582 { 583 return GetFileList("ftp://" + strFtpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectoryDetails); 584 } 585 586 } 587 } 588 589 590 591
参考了如下网站内容并做了相应修改和完善
http://zhufangzeng.blog.163.com/blog/static/249191412010668453343/
https://social.msdn.microsoft.com/Forums/en-US/fc669934-d6d2-4815-b1ea-9a06006f05b7/moving-a-file-from-one-folder-to-another-ftp?forum=netfxnetcom&prof=required