gpt4 book ai didi

c# - 重用 FtpWebRequest

转载 作者:太空狗 更新时间:2023-10-29 17:48:15 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的方法,使用 FtpWebRequest 和方法 WebRequestMethods.Ftp.DownloadFile 从 FTP 下载文件。问题是我不想显示下载进度,因此需要提前知道文件大小才能计算传输百分比。但是当我在 FtpWebRequest 中调用 GetResponse 时,ContentLength 成员是 -1。

好的 - 所以我使用 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

现在我得到了文件大小。所以是时候下载文件了。设置方法现在会导致上述异常。那么我要创建一个新的 FtpWebRequest 吗?还是无论如何要重置要重用的请求? (关闭响应没有任何区别。)

我不明白如何在不重新创建对象的情况下继续前进。我可以那样做,但就是感觉不对。所以我在这里发帖,希望能找到正确的方法。

这是(非工作)代码(输入是 sURI、sDiskName、sUser 和 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();

我希望有人能解释这是如何工作的。提前致谢。

最佳答案

我认为这不会得到解答,所以我通过告诉您我是如何解决它来“关闭它”。

嗯,我并没有真正解决它。然而,我确实通过重新创建 FtpWebRequest 来测试下载,并注意到在 FTP 服务器上它的行为符合我的要求,即只有一次登录然后按顺序执行我的请求。

这是获取文件大小并开始下载的代码的结束方式:

// Start by fetching the file size
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(sURI);

request.Method = WebRequestMethods.Ftp.GetFileSize;
NetworkCredential nc = new NetworkCredential(sUser, sPwd);
request.Credentials = nc;
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;

// Get the result (size)
FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
Int64 contLen = resp.ContentLength;

// and now download the file
request = (FtpWebRequest)FtpWebRequest.Create(sURI);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = nc;
request.UseBinary = true;
request.UsePassive = true;
request.KeepAlive = true;

resp = (FtpWebResponse)request.GetResponse();

所以没有关于是否可以重置 FtpWebRequest 以供重新使用的答案。但至少我知道没有传输冗余信息。

感谢所有感兴趣并花时间思考答案的人。

关于c# - 重用 FtpWebRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com