Ftp upload - C# (235341)

Узнай цену своей работы

Формулировка задачи:

Пытаюсь загрузить файл на сервер с ограничением скорости. Вот код:
            Stream stream = request.GetRequestStream();
            Stream throttle = new ThrottledStream(stream, 10);
            throttle.Write(fileContents, 0, fileContents.Length);
            return true;
Файл грузится, но без ограничений. ThrottledStream взял отсюда http://www.codeproject.com/Articles/18243/Bandwidth-throttling
Прям загадка какая-то.
        public static bool FtpUpload(string uri, string file)
        {
            Stopwatch sw = new Stopwatch();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri + file);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
            request.Credentials = new NetworkCredential("", "");
 
            byte[] fileContents = File.ReadAllBytes(file.Replace("|", null));
            File.Delete(file.Replace("|", null));
            request.ContentLength = fileContents.Length;
            Stream stream = request.GetRequestStream();
            long bytes = 5000;
            Stream throttle = new launcher.ThrottledStream(stream, bytes);
            sw.Start();
            stream.Write(fileContents, 0, fileContents.Length);
            sw.Stop();
            MessageBox.Show(sw.ElapsedMilliseconds.ToString());
            sw.Reset();
            sw.Start();
            throttle.Write(fileContents, 0, fileContents.Length);
            sw.Stop();
            MessageBox.Show(sw.ElapsedMilliseconds.ToString());
            return true;
        }
Добавил ещё 1 запись файла и Stopwatch, заливается столько, сколько нужно. Убираю запись опять на максимальной скорости закачка идёт. И ещё. В первый запуск sw 0 показывает.
            Stopwatch sw = new Stopwatch();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri + file);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
            request.Credentials = new NetworkCredential("", "");
 
            byte[] fileContents = File.ReadAllBytes(file.Replace("|", null));
            File.Delete(file.Replace("|", null));
            request.ContentLength = fileContents.Length;
            Stream stream = request.GetRequestStream();
            long bytes = 5000;
            Stream throttle = new launcher.ThrottledStream(stream, bytes);
            sw.Start();
           // stream.Write(fileContents, 0, fileContents.Length);
            sw.Stop();
            MessageBox.Show(sw.ElapsedMilliseconds.ToString());
            sw.Reset();
            sw.Start();
            throttle.Write(fileContents, 0, fileContents.Length);
            sw.Stop();
            MessageBox.Show(sw.ElapsedMilliseconds.ToString());
            return true;
Работает.
            Stopwatch sw = new Stopwatch();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri + file);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
            request.Credentials = new NetworkCredential("", "");
 
            byte[] fileContents = File.ReadAllBytes(file.Replace("|", null));
            File.Delete(file.Replace("|", null));
            request.ContentLength = fileContents.Length;
            Stream stream = request.GetRequestStream();
            long bytes = 5000;
            Stream throttle = new launcher.ThrottledStream(stream, bytes);
            throttle.Write(fileContents, 0, fileContents.Length);
            return true;
Не работает((( Как с этим sw связан?
М... Какое-то странное решение нашлось.
Stopwatch sw = new Stopwatch();
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri + file);
            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.UseBinary = true;
            request.Credentials = new NetworkCredential("", "");
 
            byte[] fileContents = File.ReadAllBytes(file.Replace("|", null));
            File.Delete(file.Replace("|", null));
            request.ContentLength = fileContents.Length;
            Stream stream = request.GetRequestStream();
            long bytes = 3000;
            Stream throttle = new launcher.ThrottledStream(stream, bytes);
            Thread.Sleep(10);
            throttle.Write(fileContents, 0, fileContents.Length);
            return true;
Буду признателен, если кто-то объяснит почему эта хрень работает только после слипа. Пробовал ещё Sleep(1), тоже не пашет.
Походу ни то, ни другое не пашет. Просто пауза выставляется а потом сразу весь файл заливается. хээээлп(

Решение задачи: «Ftp upload»

textual
Листинг программы
            ThrottledStream str = new ThrottledStream(request.GetRequestStream(), 5 * 1024);
            str.Write(buff, 0, buff.Length);
            str.Close();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5