iT邦幫忙

1

C# WPF 使用FTP協定傳送資料夾下檔案

 打擾各位先進,想請問C#下如何使用FTP協定上傳資料夾下所有檔案至伺服器呢?

 EX:
  資料夾下有:
     a.txt
     b.txt
     c.txt
     d.txt

 按下"上傳"按鍵上傳至FTP伺服器去。

目前編輯出來的程式碼如下:

  string ftpServerIP = "127.0.0.1";
  string ftpUserID = txtUserid.Text;
  string ftpPassword = txtPassword.Text;

  FtpWebRequest ftprequest =(FtpWebRequest)WebRequest.Create(ftpServerIP);
  ftprequest.Method = WebRequestMethods.Ftp.UploadFile;
  ftprequest.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
  StreamReader sourceStream = newStreamReader(txtFtpFromShushinFolder.Text);
  byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
  sourceStream.Close();
  ftprequest.ContentLength = fileContents.Length;

  Stream requestStream = request.GetRequestStream();
  requestStream.Write(fileContents, 0, fileContents.Length);
  requestStream.Close();

  FtpWebResponse response = (FtpWebResponse)ftprequest.GetResponse();

                   

  response.Close();
                   

 煩請先進指點方向,感恩!!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
小碼農米爾
iT邦高手 1 級 ‧ 2019-01-09 22:29:30
最佳解答

提供一個可以上傳任何檔案的版本。

var basePath = AppDomain.CurrentDomain.BaseDirectory;

var serverIP = "ftp://127.0.0.1/";
var userID = "ftp";
var userPW = "0000";

var folder = new DirectoryInfo($"{basePath}File");
var files = folder.GetFiles();
foreach(var file in files)
{
    var fileName = System.IO.Path.GetFileName(file.FullName);
    var request = (FtpWebRequest)WebRequest.Create(serverIP + fileName);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.KeepAlive = true;
    request.UseBinary = true;
    request.Credentials = new NetworkCredential(userID, userPW);
    request.ContentLength = new FileInfo(file.FullName).Length;

    //上傳檔案
    using (var requestStream = request.GetRequestStream())
    {
        //緩衝區大小100KB
        var bufferSize = 102400;
        var buffer = new byte[bufferSize];
        using (var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
        {
            fs.Seek(0, SeekOrigin.Begin);

            var readCount = 0;
            while (true)
            {
                readCount = fs.Read(buffer, 0, bufferSize);
                if (readCount == 0)
                    break;
                requestStream.Write(buffer, 0, readCount);
            }
        }
    }

    //上傳成功
    var response = (FtpWebResponse)request.GetResponse();
}
1
小魚
iT邦大師 1 級 ‧ 2019-01-09 13:53:58

你這是用什麼套件嗎?
我之前是有用過WinSCPnet套件...

看更多先前的回應...收起先前的回應...
narumi iT邦新手 5 級 ‧ 2019-01-09 14:03:37 檢舉

想請問套件的意思是?

小魚 iT邦大師 1 級 ‧ 2019-01-09 14:09:33 檢舉

/images/emoticon/emoticon38.gif

小魚 iT邦大師 1 級 ‧ 2019-01-09 14:10:35 檢舉

寫C#不知道套件 XD
看來你真的是初學者,
你先上網搜尋一下關鍵字吧...

narumi iT邦新手 5 級 ‧ 2019-01-09 14:12:17 檢舉

您要是說NuGet,並無使用。

Homura iT邦高手 1 級 ‧ 2019-01-09 14:16:19 檢舉

他是用WebRequest是原生的

小魚 iT邦大師 1 級 ‧ 2019-01-09 14:16:54 檢舉

套件不只有Nuget,
我記得當初我Google就解決問題了,
雖然往往要把好幾篇的文章的內容湊一湊才能用,
如果要走這行Google的技能是一定要點的.

小魚 iT邦大師 1 級 ‧ 2019-01-09 14:19:13 檢舉

Homura
我是沒用過FtpWebRequest
不知道你有沒有用過,
C#很多原生的都不好用,
所以滿街都是套件...
剛剛無聊搜尋一下 C# 套件,
大概有70萬筆資料 XD

估計C#的套件數量,
大概比台灣的大學生還多吧 XD

narumi iT邦新手 5 級 ‧ 2019-01-09 14:23:20 檢舉

本人已經很努力GOOGLE了,目前大約捉出的方向是:

1.先讀出資料夾下所有檔案放到LIST裡(用FOR或是foreach)
2.在LIST清空前一直執行FTP上傳
3.清空LIST後跳出迴圈關閉FTP COUNT

不知道這方向正確嗎?

心聲:

我想我不是只想不勞而獲的小白,該GOOGLE的該找的一定會先去做到沒辦法後才會開口問人。但在海量資料中很容易迷失方向,所以才想先進們協助指點一下。

Homura iT邦高手 1 級 ‧ 2019-01-09 14:27:36 檢舉

narumi
是這樣做沒錯
小魚
是的很多原生不好用
但是ftp如果只是做簡單的動作還行
爬蟲用WebRequest會用到抓狂

小魚 iT邦大師 1 級 ‧ 2019-01-09 14:30:32 檢舉

說了這麼多,
所以你現在進行到哪一步了?
卡在什麼問題?
哪部分做到了哪部分還有問題?

narumi iT邦新手 5 級 ‧ 2019-01-09 14:35:49 檢舉

前輩不好意思跟你頂嘴,目前想實現的是如何將資料夾下的檔案逐一上傳至FTP伺服器中。目前本人先實驗剛找到的範例改看看。

小魚 iT邦大師 1 級 ‧ 2019-01-09 15:22:42 檢舉

你的問題太大了,
你應該先把大問題拆成很多小問題,
然後去看哪個部分可以做到,
哪個部分有問題,
然後一個一個測試,
每個小問題獨立測試,
再組成一個完整的程式碼,
我在寫程式的時候都會有一個小的測試專案,
就是在針對小問題做測試,

譬如這個問題,
應該拆成幾個問題

1.讀取資料夾中的所有檔案並記錄(類似你說的List)
2.一個一個檔案上傳到FTP
3.後續動作的處理

看起來跟你的流程差不多,
基本上每個小問題都可以獨立測試,
外面再包個try catch抓問題,
抓到問題寫Log,
這樣應該就差不多了.

--
話說,
我是不會給魚的,
(小魚不能給魚)
至少不會一次給很多條魚,
你要的魚太多了,
不過可以教你釣魚的方法.
(不要吃小魚 XD)

可是,小魚比較好吃......

離題了

其實我現在也正在搞c#跟.net。對.net而言,我也算是完全的初學著就是了。(現在一直在求教某位叔叔)

1
Homura
iT邦高手 1 級 ‧ 2019-01-09 14:25:53

你的問題應該是要抓到資料夾底下所以檔案名稱
然後再用迴圈一個一個上傳
不過我看你好像找到方向了
這篇參考

看更多先前的回應...收起先前的回應...
narumi iT邦新手 5 級 ‧ 2019-01-09 14:28:34 檢舉

正好我也找到這文章,目前正在測試看看讀取結果是否為本人想要的結果。

感謝指點!

Homura iT邦高手 1 級 ‧ 2019-01-09 14:39:59 檢舉

narumi
你應該差這步就完成了
加油/images/emoticon/emoticon12.gif

narumi iT邦新手 5 級 ‧ 2019-01-09 16:53:36 檢舉
string ftpServerIP = "ftp://ftp.speed.hinet.net/";
string ftpUserID = "ftp";
string ftpPassword = "ftp";
DirectoryInfo folder = new DirectoryInfo(@"C:\Users\gunji\Desktop\data");

foreach (FileInfo file in folder.GetFiles("*.txt"))
{

  Console.WriteLine(file.FullName);
  string filename = Path.GetFileName(file.FullName);

  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServerIP + filename);
  request.Method = WebRequestMethods.Ftp.UploadFile;
  request.KeepAlive = true;
  request.UseBinary = true;
  // This example assumes the FTP site uses anonymous logon.
  request.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

  // Copy the contents of the file to the request stream.
  byte[] fileContents;
  using (StreamReader sourceStream = new StreamReader(file.FullName))
   {
      fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
   }

 request.ContentLength = fileContents.Length;

 using (Stream requestStream = request.GetRequestStream())
   {
    requestStream.Write(fileContents, 0, fileContents.Length);
   }

 using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
   {
     Console.WriteLine($"Upload File Complete, status {response.StatusDescription}");
   }


}

解出來了,目前用這種方式完成預想的結果了。(汗

Homura iT邦高手 1 級 ‧ 2019-01-09 17:00:53 檢舉

narumi
恭喜/images/emoticon/emoticon42.gif

我要發表回答

立即登入回答