C#(99):FtpWebRequest與FtpWebResponse完成FTP操作


一、WebRequestMethods.Ftp類:

表示可與 FTP 請求一起使用的 FTP 協議方法的類型。

  • Append​File  :  表示要用於將文件追加到 FTP 服務器上的現有文件的 FTP APPE 協議方法。
  • Delete​File    :表示要用於刪除 FTP 服務器上的文件的 FTP DELE 協議方法。
  • Download​File    :表示要用於從 FTP 服務器下載文件的 FTP RETR 協議方法。
  • Get​Date​Timestamp    :表示要用於從 FTP 服務器上的文件檢索日期時間戳的 FTP MDTM 協議方法。
  • Get​File​Size    :表示要用於檢索 FTP 服務器上的文件大小的 FTP SIZE 協議方法。
  • List​Directory    :表示獲取 FTP 服務器上的文件的簡短列表的 FTP NLIST 協議方法。
  • List​Directory​Details    :表示獲取 FTP 服務器上的文件的詳細列表的 FTP LIST 協議方法。
  • Make​Directory    :表示在 FTP 服務器上創建目錄的 FTP MKD 協議方法。
  • Print​Working​Directory    :表示打印當前工作目錄的名稱的 FTP PWD 協議方法。
  • Remove​Directory    :表示移除目錄的 FTP RMD 協議方法。
  • Rename    :表示重命名目錄的 FTP RENAME 協議方法。
  • Upload​File    :表示將文件上載到 FTP 服務器的 FTP STOR 協議方法。
  • Upload​File​With​Unique​Name    :表示將具有唯一名稱的文件上載到 FTP 服務器的 FTP STOU 協議方法。

二、上傳文件:

OpenFileDialog opFilDlg = new OpenFileDialog();
if (opFilDlg.ShowDialog() == DialogResult.OK)
{   ftp = new YBBFTPClass("hz.a.cn", "", "csp", "welcome", 0);
    ftp.UploadFile(opFilDlg.FileName);
    MessageBox.Show("上傳成功");
}

/// <summary>
/// 文件上傳
/// </summary>
/// <param name="filename">本地文件路徑</param>
public void UploadFile(string filename)
{
    FileInfo fileInf = new FileInfo(filename);
    string uri = "ftp://" + RemoteHost + "/" + fileInf.Name;
    FtpWebRequest reqFTP;

    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileInf.Name));// 根據uri創建FtpWebRequest對象
    reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass); // ftp用戶名和密碼
    reqFTP.KeepAlive = false; // 默認為true,連接不會被關閉, 在一個命令之后被執行
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定執行什么命令
    reqFTP.UseBinary = true; // 指定數據傳輸類型
    reqFTP.ContentLength = fileInf.Length; // 上傳文件時通知服務器文件的大小

    int contentLen;
    FileStream fileStream = fileInf.OpenRead(); // 打開一個文件讀取內容到fileStream中
    contentLen = fileStream.Read(buffer, 0, buffer.Length); ;//從fileStream讀取數據到buffer中

    Stream requestStream = reqFTP.GetRequestStream();
    // 流內容沒有結束
    while (contentLen != 0)
    {
        requestStream.Write(buffer, 0, contentLen);// 把內容從buffer 寫入 requestStream中,完成上傳。
        contentLen = fileStream.Read(buffer, 0, buffer.Length);
    }

    // 關閉兩個流
    requestStream.Close();
    //uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
    fileStream.Close();
}

三、下載文件

1、核心代碼

/// <summary>
/// 下載文件
/// </summary>
/// <param name="filePath">本地目錄</param>
/// <param name="fileName">遠程路徑</param>
public void DownloadFile(string filePath, string fileName)
{
    FtpWebRequest reqFTP;
    try
    {
        FileStream fileStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileName));
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass);

        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream responseStream = response.GetResponseStream();//從ftp響應中獲得響應流

        //long cl = response.ContentLength;
        byte[] buffer = new byte[1024];
        int readCount;

        readCount = responseStream.Read(buffer, 0, buffer.Length);//從ftp的responseStream讀取數據到buffer中
        while (readCount > 0)
        {
            fileStream.Write(buffer, 0, readCount);//從buffer讀取數據到fileStream中,完成下載
            readCount = responseStream.Read(buffer, 0, buffer.Length);
        }

        responseStream.Close();
        fileStream.Close();
        response.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

2、winform:、

FolderBrowserDialog fldDlg = new FolderBrowserDialog();
if (txtUpload.Text.Trim().Length > 0)
{
    if (fldDlg.ShowDialog() == DialogResult.OK)
    {
        ftp.DownloadFile(fldDlg.SelectedPath, txtUpload.Text.Trim());
        MessageBox.Show("下載成功");
    }
}
else
{
    MessageBox.Show("Please enter the File name to download");
}

3、webform彈出下載提示:

FtpClient _client = new FtpClient();
Stream stream = _client.OpenRead(FtpFilePath, FtpDataType.Binary);

string FtpFilePath = Request.QueryString["FilePath"];
string _fname = Path.GetFileName(FtpFilePath);
Response.ContentType = "application/" + _fname.Split('.')[1];
Response.AddHeader("Content-disposition", "attachment; filename=" + _fname);

byte[] buffer = new byte[10240];
int readCount;
do
{
    readCount = stream.Read(buffer, 0, buffer.Length);
    Response.OutputStream.Write(buffer, 0, readCount);//持續寫入流
} while (readCount != 0);

Response.OutputStream.Write(buffer, 0, buffer.Length);

Response.End();

四、刪除文件

string uri = "ftp://" + RemoteHost + "/" + fileName;
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + fileName));

reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;

string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();

完整代碼參考:

http://www.cnblogs.com/hsiang/p/7247801.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM