FTP. Как или что быстрее?
От: Sharov Россия  
Дата: 29.12.15 16:22
Оценка:
Здравствуйте!

Стоит задача загрузить файл с FTP. Вопрос что быстрее: сначала проверить, есть ли этот файл на сайтах ( а их несколько,зеркалируют друг друга), или же сразу ломится загружать?В первом случае если файл отсутствует, переключаюсь на др. объект и его файл и далее по кругу. Во втором случае логика такая: сначала ломимся на один сайт, если несколько раз отлуп, ломимся на др. сайт и т.д. пока список возможных сайтов не исчерпается. И вот дилемма, как с одной стороны сделать надежнее, а с другой быстрее? Проверка файла перед загрузкой надежнее, но дольше. Загрузка сразу быстрее, но не надежна. И да, в большинстве случаев, проверяемые файлы будут на месте.

Код проверки файла на FTP:

 public static Task<bool> CheckFtpFileAvaliabilityAsync(Uri uri)
        {
            Logger.Info(String.Format("Start validating file {0}...", uri));
            
            var request = (FtpWebRequest)WebRequest.Create(uri);
            request.Credentials = new NetworkCredential("", "");
            request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
            request.KeepAlive = false;
            request.Timeout = 3*1000;
            return Task<bool>.Factory.FromAsync(request.BeginGetResponse, ia =>
                {
                    try
                    {
                        var webResponse = request.EndGetResponse(ia);
                        return true;
                    }
                    catch(Exception e)
                    {
                        Logger.Warn(String.Format("Error validating file {0}", request.RequestUri), e);
                        return  false;
                    }
                }, request);
        }


код загрузки файла:
 public static Task<Tuple<string, Stream>> GetFtpFileAsync(Uri uri, bool useIoCallback = true)
        {
            if (uri == null) throw new ArgumentNullException("uri");

            Logger.Info(String.Format("Start downloading file {0}...", uri));

            var webRequest = (FtpWebRequest)WebRequest.Create(uri);
            webRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            webRequest.AuthenticationLevel = AuthenticationLevel.None;
            webRequest.Credentials = new NetworkCredential("", "");
            webRequest.Timeout = 10000;
            
            
            webRequest.KeepAlive = false;

            string filename;
            if (useIoCallback)
            {
                var uri1 = uri;
                return Task<Tuple<string, Stream>>.Factory.FromAsync(webRequest.BeginGetResponse, (ia) =>
                    {
                        try
                        {
                            WebResponse webResponse = webRequest.EndGetResponse(ia);
                            var stream = webResponse.GetResponseStream();
                            filename = uri1.Segments.Last();
                            Logger.Info(String.Format("File {0} downloaded successfully!", uri));
                            return new Tuple<string, Stream>(filename, stream);
                        }
                        catch(Exception e)
                        {
                            Logger.Error(String.Format("Error downloading file {0}", webRequest.RequestUri), e);
                            throw;
                        }
                    }, webRequest);
            }
            filename = uri.Segments.Last();

            return webRequest.GetResponseAsync()
                             .ContinueWith(t =>
                                 {
                                     Logger.Info(String.Format("File {0} downloaded successfully!", uri));
                                     return new Tuple<string, Stream>(filename, t.Result.GetResponseStream());
                                 }, TaskContinuationOptions.ExecuteSynchronously);
        }


Заранее благодарю.
Кодом людям нужно помогать!
.net ftp
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.