这是一个从FTP服务器下载单个文件并将其保存到磁盘的函数--这是我第一次使用FTP做任何事情,如果我错过了什么,请告诉我。
public void DownloadFile(string fileloc, string saveLoc)
{
try
{
// Get the object used to communicate with the server.
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fileloc);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(Username, Password);
using (var response = (FtpWebResponse)request.GetResponse())
{
using (var fileStream = File.Create(saveLoc))
{
response.GetResponseStream().CopyTo(fileStream);
}
}
}
catch (Exception EX)
{
throw EX;
}
}发布于 2012-06-18 16:02:16
首先,就像ANeves说的,您的catch唯一做的事情就是重置异常的堆栈跟踪,这不是您想要做的。只需完全删除try/catch,在这里就没有用了。
其次,我看不出有什么理由在这里使用WebRequest,使用WebClient要简单得多。
另外,您可能希望有更好的参数名称:fileloc没有说明它到底是什么,也没有使用通常的大写。loc是不必要的缩写(你不是想写一个推特帖子,因为每个字符都很重要,可读性更重要),而且太模棱两可。
public void DownloadFile(string url, string savePath)
{
var client = new WebClient();
client.Credentials = new NetworkCredential(Username, Password);
client.DownloadFile(url, savePath);
}可以将此方法重写为一个表达式,但我可能不会这样做:
public void DownloadFile(string url, string savePath)
{
new WebClient { Credentials = new NetworkCredential(Username, Password) }
.DownloadFile(url, savePath);
}发布于 2012-06-18 15:46:48
使用throw ex;重新抛出异常时,会刷新其堆栈跟踪。(帧?)这意味着异常似乎最初是在您的throw ex;行中引发的,并且丢失了以前的堆栈跟踪。
您只想简单地使用throw; -就像这样:
try {
new Profiterole(); // BOOM!
} catch (Exception ex) {
throw; // Preserves the stacktrace, showing that the Exception was raised in InitGlacing();
}正如@svick所建议的那样:更好的是,根本没有try/catch;它在这里没有任何用途。
发布于 2012-06-20 07:04:28
如果有一个缓冲区参数,或者至少重载函数来提供一个参数,这总是很好的。我认为使用FtpWebRequest与WebClient是合情合理的,因为增加缓冲区可以大大提高传输速度,并使所有可用的网络带宽饱和。你不会看到小文件的任何改进,但是如果你下载任何超过100 if的东西,你就会开始看到一个明显的不同。
只需将CopyTo作为
responseStream.CopyTo(fileStream, buffer)它将为你做所有的工作。默认值为4096字节(4kb)。需要进行一些测试才能找到正确的缓冲区,但我发现32 It运行良好。
https://codereview.stackexchange.com/questions/12697
复制相似问题