pas*_*ets 4 c# ftp performance filesize file-listing
我想获取FTP服务器上每个文件的文件名,文件大小和上次修改时间,然后用它填充listView.
它工作得非常好,直到我切换FTP主机,现在它真的很迟钝,尽管新的主机在真正的FTP客户端同样快.
任何明显的原因为什么?
此外,每次发送登录凭据是否真的有必要?
我正在使用第一种方法来获取字符串数组,然后遍历它并在每个项目上使用第二个方法来获取文件大小:
public static string[] GetFileList()
{
string[] downloadFiles;
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://mysite.se/"));
request.UseBinary = true;
request.Credentials = new NetworkCredential(settings.Username, settings.Password);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.UseBinary = true;
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
// to remove the trailing '\n'
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
downloadFiles = null;
return downloadFiles;
}
}
public static int GetFileSize(string file)
{
//MessageBox.Show("getting filesize...");
StringBuilder result = new StringBuilder();
FtpWebRequest request;
try
{
request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://mysite.se/" + file));
request.UseBinary = true;
request.Credentials = new NetworkCredential(settings.Username, settings.Password);
request.Method = WebRequestMethods.Ftp.GetFileSize;
int dataLength = (int)request.GetResponse().ContentLength;
return dataLength;
}
catch (Exception ex)
{
//System.Windows.Forms.MessageBox.Show(ex.Message);
return 1337;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是每个GetFileSize调用都必须重新连接到服务器并发出文件大小请求.如果您可以设置使用单个持久连接,那么您将节省连接时间,但仍会花费大量时间为每个文件发送请求并等待响应.
(编辑:可能已经是这种情况.MSDN说:如果可能,多个FtpWebRequests重用现有连接.)
如果您使用ListDirectoryDetails而不是ListDirectory,则服务器可能会发送更多信息(文件大小,权限等)以及每个文件名.这不仅仅需要执行ListDirectory,您可以从每行中提取名称和大小,并存储大小以供日后使用.
但是,不同的服务器可能会以不同的格式发送信息,有些可能根本不发送大小信息,因此如果您需要程序可靠地使用任何FTP服务器,这可能无济于事.