我正在尝试制作一个将.exe
文件上传/下载到FTP
我尝试使用FtpWebRequest
,但我只能成功上传和下载.txt文件。
然后我在这里找到了使用WebClient
:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential("username", "password");
byte[] fileData = request.DownloadData("ftp://myFTP.net/");
FileStream file = File.Create(destinatie);
file.Write(fileData, 0, fileData.Length);
file.Close();
此解决方案有效。但是我看到WebClient
有一个方法DownloadFile
没有用。我认为,因为它仅在FTP
上对HTTP
起作用。我的假设是真的吗?如果不是我怎么能让它工作?
还有其他解决方案可以使用.exe
将FtpWebRequest
文件上传/下载到ftp吗?
答案 0 :(得分:12)
WebClient.UploadFile
和WebClient.DownloadFile
都可以正常用于FTP和二进制文件。
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.UploadFile(
"ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");
如果您需要更强的控件,WebClient
不提供(如TLS / SSL加密,ascii /文本传输模式等),请使用FtpWebRequest
。简单的方法是使用Stream.CopyTo
将FileStream
复制到FTP流:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;
using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
fileStream.CopyTo(ftpStream);
}
如果您需要监控上传进度,则必须自行复制内容:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;
using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
byte[] buffer = new byte[10240];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ftpStream.Write(buffer, 0, read);
Console.WriteLine("Uploaded {0} bytes", fileStream.Position);
}
}
对于GUI进度(WinForms ProgressBar
),请参阅:
How can we show progress bar for upload with FtpWebRequest
如果要上传文件夹中的所有文件,请参阅
Upload directory of files using WebClient
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.DownloadFile(
"ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");
如果您需要更强的控件,WebClient
不提供(如TLS / SSL加密,ascii /文本传输模式等),请使用FtpWebRequest
。简单的方法是使用Stream.CopyTo
FileStream
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
ftpStream.CopyTo(fileStream);
}
如果您需要监控下载进度,则必须自行复制内容:
FtpWebRequest request =
(FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.DownloadFile;
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"C:\local\path\file.zip"))
{
byte[] buffer = new byte[10240];
int read;
while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, read);
Console.WriteLine("Downloaded {0} bytes", fileStream.Position);
}
}
对于GUI进度(WinForms ProgressBar
),请参阅:
FtpWebRequest FTP download with ProgressBar
如果要从远程文件夹下载所有文件,请参阅
C# Download all files and subdirectories through FTP
答案 1 :(得分:3)
您需要说明您是上传文字还是二进制文件。 声明请求后添加以下行&初始化:
request.UseBinary = true;
http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.usebinary.aspx
答案 2 :(得分:3)
上传很简单......
void Upload(){
Web client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
client.BaseAddress = "ftp://ftpsample.net/";
client.UploadFile("sample.txt", "sample.txt"); //since the baseaddress
}
<小时/> 下载也很容易...... 我在下面创建的代码使用BackgroundWorker(因此在下载开始时它不会冻结接口/应用程序)。另外,我使用lambda
(=>)
缩短了代码。
void Download(){
Web client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += (s, e) => {
client.DownloadFile("ftp://ftpsample.net/sample.zip", "sample.zip");
};
bg.RunWorkerCompleted += (s, e) => { //when download is completed
MessageBox.Show("done downloading");
download1.Enabled = true; //enable download button
progressBar.Value = 0; // reset progressBar
};
bg.RunWorkerAsync();
download1.Enabled = false; //disable download button
while (bg.IsBusy)
{
progressBar.Increment(1); //well just for extra/loading
Application.DoEvents(); //processes all windows messages currently in the message queue
}
}
您还可以使用DownloadFileAsync方法显示实际进度文件下载:
client.DownloadFileAsync(new Uri("ftp://ftpsample.net/sample.zip"), "sample.zip");
client.DownloadProgressChanged += (s, e) =>
{
progressBar.Value = e.ProgressPercentage; //show real download progress
};
client.DownloadFileCompleted += (s, e) =>
{
progressBar.Visible = false;
// other codes after the download
};
//You can remove the 'while' statement and use this ^