打擾各位先進,想請問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();
煩請先進指點方向,感恩!!
提供一個可以上傳任何檔案的版本。
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();
}
你這是用什麼套件嗎?
我之前是有用過WinSCPnet套件...
想請問套件的意思是?
寫C#不知道套件 XD
看來你真的是初學者,
你先上網搜尋一下關鍵字吧...
您要是說NuGet,並無使用。
他是用WebRequest是原生的
套件不只有Nuget,
我記得當初我Google就解決問題了,
雖然往往要把好幾篇的文章的內容湊一湊才能用,
如果要走這行Google的技能是一定要點的.
Homura
我是沒用過FtpWebRequest
不知道你有沒有用過,
C#很多原生的都不好用,
所以滿街都是套件...
剛剛無聊搜尋一下 C# 套件,
大概有70萬筆資料 XD
估計C#的套件數量,
大概比台灣的大學生還多吧 XD
本人已經很努力GOOGLE了,目前大約捉出的方向是:
1.先讀出資料夾下所有檔案放到LIST裡(用FOR或是foreach)
2.在LIST清空前一直執行FTP上傳
3.清空LIST後跳出迴圈關閉FTP COUNT
不知道這方向正確嗎?
心聲:
我想我不是只想不勞而獲的小白,該GOOGLE的該找的一定會先去做到沒辦法後才會開口問人。但在海量資料中很容易迷失方向,所以才想先進們協助指點一下。
說了這麼多,
所以你現在進行到哪一步了?
卡在什麼問題?
哪部分做到了哪部分還有問題?
前輩不好意思跟你頂嘴,目前想實現的是如何將資料夾下的檔案逐一上傳至FTP伺服器中。目前本人先實驗剛找到的範例改看看。
你的問題太大了,
你應該先把大問題拆成很多小問題,
然後去看哪個部分可以做到,
哪個部分有問題,
然後一個一個測試,
每個小問題獨立測試,
再組成一個完整的程式碼,
我在寫程式的時候都會有一個小的測試專案,
就是在針對小問題做測試,
譬如這個問題,
應該拆成幾個問題
1.讀取資料夾中的所有檔案並記錄(類似你說的List)
2.一個一個檔案上傳到FTP
3.後續動作的處理
看起來跟你的流程差不多,
基本上每個小問題都可以獨立測試,
外面再包個try catch抓問題,
抓到問題寫Log,
這樣應該就差不多了.
--
話說,
我是不會給魚的,
(小魚不能給魚)
至少不會一次給很多條魚,
你要的魚太多了,
不過可以教你釣魚的方法.
(不要吃小魚 XD)
可是,小魚比較好吃......
離題了
其實我現在也正在搞c#跟.net。對.net而言,我也算是完全的初學著就是了。(現在一直在求教某位叔叔)
你的問題應該是要抓到資料夾底下所以檔案名稱
然後再用迴圈一個一個上傳
不過我看你好像找到方向了
這篇參考
narumi
你應該差這步就完成了
加油
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}");
}
}
解出來了,目前用這種方式完成預想的結果了。(汗
narumi
恭喜