0

私が考えているようにこれを説明したいと思っています

サプライヤーのリストからの製品を含む Web アプリがあります。例: 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 に答える