ASP.NET C# 在 ftp 上搜索文件(更好的代码)
本文关键字:更好 代码 文件 搜索 NET ftp ASP | 更新日期: 2023-09-27 18:33:47
希望我像我在想的那样解释这一点
我有一个网络应用程序,其中包含来自供应商列表的产品。例如,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 个(,并且只选择我需要的文件。
我的问题:有没有更好的方法来只过滤我需要的图像,而不是遍历整个目录?
或者,也许是获取这些图像的另一种方法?
我没有找到使用过滤器执行目录列表 Ftp 请求的方法,但我可能有办法提高解决方案的性能。
您可以启动一个新线程,该线程每 x 分钟获取一次 directoryList 并将结果存储在内存中。
如果您正在寻找一个文件,您可以从内存中提供列表(大大提高性能(,但风险是找不到该文件(此时您可以执行当前代码(。在最坏的情况下,内存搜索操作会导致一些开销,但与具有如此大结果集的 ftp 请求相比,它应该可以忽略不计。