FtpWebRequest
を使用して、WebRequestMethods.Ftp.DownloadFile
という方法でFTPからファイルをダウンロードする簡単な方法を作成しようとしています。問題は、ダウンロードの進捗状況を表示することができず、転送される割合を計算できるように先にファイルサイズを知る必要があることです。しかし、をFtpWebRequest
に電話すると、ContentLength
のメンバーは-1になります。FtpWebRequestを再利用
OK - 私はWebRequestMethods.Ftp.GetFileSize
という方法でファイルのサイズをあらかじめ取得しています。問題ない。その後、サイズを取得した後、私はファイルをダウンロードします。
問題の問題が表示された場所です...
は、サイズを取得した後、私はFtpWebRequest
を再利用しようとWebRequestMethods.Ftp.DownloadFile
にメソッドをリセットします。これにより、System.InvalidOperationException
というメッセージが表示されます。「要求の送信後にこの操作を実行できません。 (私がスウェーデン語で手に入れたものから翻訳されたものではないかもしれません)。
KeepAlive
プロパティをtrueに設定している限り、それは問題ではなく、接続はアクティブのままです。これは私が理解できないものです...私が作成した唯一のオブジェクトは、私のFtpWebRequest
オブジェクトです。そして私が別のものを作成すると、どのような接続を使うべきかをどのように知ることができますか?そして、どんな資格?
擬似コード:
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
今私は、ファイルサイズを得ました。だから、ファイルをダウンロードする時間です。設定メソッドknowは上記の例外を発生させます。だから私は新しいFtpWebRequest
を作成するのですか?または、再利用するリクエストをリセットする必要がありますか? (応答を閉じても違いはありません)
オブジェクトを再作成せずに前進する方法を理解できません。私はそれをすることができましたが、それはちょうどいい気分にはなりません。だから私はこれを行う正しい方法を見つけるためにここに投稿しています。私は誰かがこれが動作するようになっている方法を説明することを願って
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();
:ここ
は(非作業)コード(。入力がスリ、sDiskName、SUSERとSPWDある)です。前もって感謝します。
少なくともHTTPWebRequestsでは、常に新しいものを作成する必要があります。ここでも同じ問題があるとします。 – Hikiko
'FtpWebRequest'は単一のリクエストを作成するのに適しています。あなたは、あなたがそれを閉じるまで永続的な接続を接続し、維持するFTPクライアントが必要です。 'System.Net.FtpClient'はよく考えられているようです:http://netftp.codeplex.com/ –