0

希望我能像我想的那样解释这个

我有一个网络应用程序,其中包含来自供应商列表的产品。例如 www.example.com.au/Browse.aspx?SupplierID=XYZ 仅显示 XYZ 供应商的产品。然后转到详细信息页面 www.example.com.au/Product.aspx?ProductID=123。此页面显示该产品的详细信息列表(图片库、产品数据表,即 PDF 等)。

现在,每个供应商都有一个 ftp 帐户,他可以在其中上传他们的产品信息 - ftp://resources.example.com.au,这可以通过 resources.example.com.au/* 访问。因此,假设供应商 XYZ 将具有以下内容:

resources.example.com.au/XYZ/123.jpg <== main product image
resources.example.com.au/XYZ/123_a.jpg <== secondary image
resources.example.com.au/XYZ/123_b.jpg <== secondary image
resources.example.com.au/XYZ/123_c.jpg <== secondary image

(由于应用程序要求,Web 应用程序与资源文件夹位于不同的服务器上)

现在,要获取相关产品图片列表,我有以下内容:

public List<string> GetFiles(string strDirectoryName, string strStartsWith)
{
    List<string> files = new List<string>();

    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFTPUrl + strDirectoryName));
    request.Method = WebRequestMethods.Ftp.ListDirectory;
    request.Credentials = new NetworkCredential(strFtpUser, strFtpPassword);

    FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);

    while (!reader.EndOfStream)
    {
        string filename = reader.ReadLine().ToString();
        if (filename.Length > 4)
        {
            if (!string.IsNullOrEmpty(strStartsWith))
            {
                if (filename.StartsWith(strStartsWith, StringComparison.OrdinalIgnoreCase))
                {
                    files.Add(filename);
                }
            }
        }
    }

    response.Close();
    responseStream.Close();
    reader.Close();

    return files;
}

不幸的是,这个函数会遍历所有文件(可能大约 100,000 个),并且只选择我需要的文件。

我的问题:有没有更好的方法来过滤我需要的图像,而不是遍历整个目录?

或者,也许是另一种获取这些图像的方法?

4

1 回答 1

0

我没有找到使用过滤器执行 directoryList Ftp 请求的方法,但我可能有办法提高您的解决方案的性能。

您可以启动一个新线程,每 x 分钟获取一次 directoryList 并将结果存储在内存中。
如果您正在寻找一个文件,您可以从内存中提供列表(大大提高性能),但有找不到文件的风险(此时您可以执行当前代码)。在最坏的情况下,内存搜索操作会导致一点开销,但与具有如此大结果集的 ftp 请求相比,它应该可以忽略不计。

于 2012-05-10T07:10:11.297 回答