Tôi đang cố gắng tạo một phương thức đơn giản để tải xuống tệp từ FTP bằng cách sử dụng FtpWebRequest
với phương thức WebRequestMethods.Ftp.DownloadFile
. Vấn đề là tôi không thể hiển thị tiến độ tải xuống và do đó cần phải biết kích thước tệp trước để có thể tính toán tỷ lệ phần trăm được chuyển. Nhưng khi tôi gọi GetResponse
trong số FtpWebRequest
thành viên ContentLength
là -1.Sử dụng lại FtpWebRequest
OK - vì vậy tôi nhận được kích thước của tệp trước bằng cách sử dụng phương thức WebRequestMethods.Ftp.GetFileSize
. Không vấn đề gì. Sau đó, sau khi nhận được kích thước tôi tải về tập tin.
Đây là nơi các vấn đề trong câu hỏi xuất hiện ...
Sau khi nhận được kích thước tôi cố gắng tái sử dụng các FtpWebRequest
và reset phương pháp để WebRequestMethods.Ftp.DownloadFile
. Điều này gây ra một số System.InvalidOperationException
nói điều gì đó như "Không thể thực hiện tác vụ này sau khi gửi yêu cầu". (có thể không phải là công thức chính xác - được dịch từ từ tôi nhận được bằng tiếng Thụy Điển).
Tôi đã tìm thấy ở nơi khác miễn là tôi đặt thuộc tính KeepAlive
thành true, không quan trọng, kết nối vẫn được duy trì hoạt động. Đây là những gì tôi không hiểu ... Đối tượng duy nhất tôi tạo ra là đối tượng FtpWebRequest
của tôi. Và nếu tôi tạo một cái khác, làm thế nào nó có thể biết được sử dụng kết nối nào? Và thông tin nào?
Pseudo code:
Create FtpWebRequest
Set Method property to GetFileSize
Set KeepAlive property to true
Set Credentials property to new NetworkCredential(...)
Get FtpWebResponse from the request
Read and store ContentLength
Bây giờ tôi có kích thước tập tin. Vì vậy, đã đến lúc tải xuống tệp. Phương thức thiết lập biết gây ra ngoại lệ được đề cập ở trên. Vậy tôi có tạo FtpWebRequest
mới không? Hoặc là có anyway để đặt lại yêu cầu để được tái sử dụng? (Đóng phản hồi không có sự khác biệt.)
Tôi không hiểu cách di chuyển về phía trước mà không cần phải tạo lại đối tượng. Tôi có thể làm điều đó, nhưng nó không cảm thấy đúng. Vì vậy, tôi đăng bài ở đây với hy vọng tìm được cách làm đúng.
Đây là (không làm việc) mã (Đầu vào là Suri, sDiskName, Suser và sPwd.):
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(sURI);
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Credentials = new NetworkCredential(sUser, sPwd);
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;
FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
int contLen = (int)resp.ContentLength;
resp.Close();
request.Method = WebRequestMethods.Ftp.DownloadFile;
resp = (FtpWebResponse)request.GetResponse();
Stream inStr = resp.GetResponseStream();
byte[] buff = new byte[16384];
sDiskName = Environment.ExpandEnvironmentVariables(sDiskName);
FileStream file = File.Create(sDiskName);
int readBytesCount;
int readTotal=0;
while ((readBytesCount = inStr.Read(buff, 0, buff.Length)) > 0)
{
readTotal += readBytesCount;
toolStripProgressBar1.Value = 100*readTotal/contLen;
Application.DoEvents();
file.Write(buff, 0, readBytesCount);
}
file.Close();
Tôi hy vọng ai đó có thể giải thích cách này là nghĩa vụ phải làm việc. Cảm ơn trước.
Ít nhất với HTTPWebRequests - bạn luôn phải tạo một tài khoản mới. Giả sử cùng một vấn đề ở đây. – Hikiko
'FtpWebRequest' rất phù hợp để thực hiện các yêu cầu duy nhất. Bạn muốn một máy khách FTP, kết nối và duy trì kết nối liên tục cho đến khi bạn đóng nó. 'System.Net.FtpClient' có vẻ được coi là tốt: http://netftp.codeplex.com/ –