C#使用ftpRequest获取完整的文件列表很慢

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)

and*_*fff 7

问题是每个GetFileSize调用都必须重新连接到服务器并发出文件大小请求.如果您可以设置使用单个持久连接,那么您将节省连接时间,但仍会花费大量时间为每个文件发送请求并等待响应.

(编辑:可能已经是这种情况.MSDN说:如果可能,多个FtpWebRequests重用现有连接.)

如果您使用ListDirectoryDe​​tails而不是ListDirectory,则服务器可能会发送更多信息(文件大小,权限等)以及每个文件名.这不仅仅需要执行ListDirectory,您可以从每行中提取名称和大小,并存储大小以供日后使用.

但是,不同的服务器可能会以不同的格式发送信息,有些可能根本不发送大小信息,因此如果您需要程序可靠地使用任何FTP服务器,这可能无济于事.