using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 網絡操作
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void menuStrip2_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void button1_Click_1(object sender, EventArgs e)
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(textBox1.Text);//可以是ftp服務器的絕對路徑也可以是相對路徑
//URI 可以是相對的也可以是絕對的。如果 URI 的形式為 "ftp://contoso.com/%2fpath"(%2f 是轉義字符“/”),則該 URI 是絕對的,而且當前目錄為 /path。但是,如果 URI 的形式為 "ftp://contoso.com/path",首先 .NET Framework 登錄到 FTP 服務器(使用由 Credentials 屬性設置的用戶名和密碼),然後將當前目錄設置為
//uri不是url所以第一個文本框中應該輸入ftp://url/cftea.txt
ftpRequest.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
//您必須擁有服務器的有效用戶名和密碼,或者服務器必須允許匿名登錄。可以通過設置 Credentials 屬性來指定用於連接服務器的憑據,也可以將它們包含在傳遞給 Create 方法的 URI 的 UserInfo 部分中。如果 URI 中包含 UserInfo 信息,則使用指定的用戶名和密碼信息將 Credentials 屬性設置為新的網絡憑據。
//為基於密碼的身份驗證方案(如基本、簡要、NTLM 和 Kerberos 身份驗證)提供憑據。
//此類不支持基於公鑰的身份驗證方法,如安全套接字層 (SSL) 客戶端身份驗證
//public NetworkCredential(string userName,string password)
FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
//若要訪問 FTP 特定的屬性,必須將此方法返回的 WebResponse 對象強制轉換為 FtpWebResponse。
//返回 FTP 服務器響應。
//FtpWebResponse封裝文件傳輸協議 (FTP) 服務器對請求的響應。
Stream data = ftpResponse.GetResponseStream(); //通過響應對象獲得響應流
//獲取流,該流用於讀取來自服務器的響應的體
//本程序中 檢索包含從 FTP 服務器上發送的響應數據的流
//get方法的 返回值一個 Stream,包含響應的體。
//GetResponseStream 方法從請求的 Internet 資源返回數據流。
string str = textBox1.Text.Substring(textBox1.Text.LastIndexOf("/"), textBox1.Text.Length - textBox1.Text.LastIndexOf("/"));
//函數參數1和參數2在 startIndex 處開頭、長度為 length 的子字符串等效的一個字符串如果找到該字符,則為 value 的從零開始的索引位置;如果未找到,則為 -1。
//str.length當前字符串中字符的數量。
// 報告指定 Unicode 字符在此實例中的最後一個匹配項的從零開始的索引位置。(本例中為最後一個/的下標位置)
//最後提取出的字符串為textBox1.Text去除/之前的字符
string SavePath = str;
if (File.Exists(SavePath))
{
File.Delete(str);
}
byte[] buffer = new byte[4096];
FileStream stream = new FileStream(SavePath, FileMode.Create);
//使用指定的路徑和創建模式初始化 FileStream 類的新實例。由 .NET Compact Framework 支持。
//摘要:
//指定操作系統應創建新文件。 如果文件已存在,它將被覆蓋。 這需要 System.Security.Permissions.FileIOPermissionAccess.Write
//權限。 FileMode.Create 等效於這樣的請求:如果文件不存在,則使用 System.IO.FileMode.CreateNew;否則使用
//System.IO.FileMode.Truncate。 如果該文件已存在但為隱藏文件,則將引發 System.UnauthorizedAccessException異常。
int count = 0;
do
{
count = data.Read(buffer, 0, buffer.Length); //讀取從ftp中獲得的響應的數據流對象
//public abstract int Read(byte[] buffer,int offset,int count)第一個參數為字節第二個為偏移量第三個為讀取的字符數
if (count > 0)
{
stream.Write(buffer, 0, count);//參照read
//這個是文件流對象通過從ftp中獲得的數據流開始讀取字符然後寫入文件流來保存
}
} while (count > 0);
//讀入緩沖區中的總字節數。 如果當前可用的字節數沒有請求的字節數那麼多,
//則總字節數可能小於請求的字節數,或者如果已到達流的末尾,則為零 (0)
ftpResponse.Close();//上一句是打算將字符串讀完,這一句是FtpWebResponse對象流關閉
stream.Close(); //stream流關閉
}
}
}