Тайм-аут листинга каталога ftp. Огромное количество subdirs
Есть ли способ справиться с ситуацией, когда вам нужно получить список всех каталогов на FTP-сервере, где количество каталогов настолько велико, что его получение занимает слишком много времени и операция завершается неудачно с истечением времени ожидания?
Интересно, есть ли какие-нибудь библиотеки, которые позволяют вам так или иначе?
2 ответа
Попробуйте что-то вроде этого
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Credentials = new NetworkCredential("anonymous","yourName@SomeDomain.com");//replace with your Creds
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
// also add some code that will Dispose of the StreamReader object
// something like ((IDisposable)streanReader).Dispose();
// Dispose of the List<string> as well
line = null;
В этом случае учетная запись, используемая вашим кодом для отображения каталога, может отличаться от учетной записи, которая использовалась для создания каталога.
Из-за этого может возникнуть проблема с правами доступа, что в конечном итоге приведет к тайм-ауту.
Пожалуйста, убедитесь, что для создания/листинга каталога используется одна учетная запись.
Например, рассмотрим каталог с именем «2012», внутри которого есть 2 подкаталога, а именно «JAN» и «FEB». Предположим, что «JAN» был создан программно, а «FEB» — вручную. Теперь, если вы попытаетесь просмотреть каталог «FEB» из своей программы, время выполнения кода может истечь, из-за чего вы почувствуете, что он завис.