Я стараюсь, чтобы получить скорость передачи данных на ФТП-загрузки, но я не знаю, где я должен "получить" это:
Код-Snippet:
Stream.CopyTo - Как получить отправленные байты?
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(job.GetDestinationFolder() + "\\" + fileOnlyName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(Manager._user, Manager._password);
using (var requestStream = request.GetRequestStream())
{
using (var input = File.OpenRead(file))
{
//input.CopyToAsync()
input.CopyTo(requestStream);
//IS HERE ANY METHOD OR ATTRIBUTE, WHICH SHOWS THE SENT BYTES ?
}
}
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
response.Close();
}
I уже прочитал, что this code
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
не очень эффективно, в соответствии с the comment, что осталось:
Note that this is not the fastest way to do it. In the provided code snippet, you have to wait for the Write to complete before a new block is read. When doing the Read and Write asynchronously this waiting will disappear. In some situation this will make the copy twice as fast. However it will make the code a lot more complicated so if speed is not an issue, keep it simple and use this simple loop.
Как я могу показать скорость передачи данных для загрузки в хроме или светлячок как?
EDIT:
Это то, что я пытался перед вами (Тянь-Динь) ответил:
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(job.GetDestinationFolder() + "\\" + fileOnlyName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(Manager._user, Manager._password);
using (var requestStream = request.GetRequestStream())
{
using (var input = File.OpenRead(file))
{
Console.WriteLine(input.Length);//bGroundWorker.ReportProgress(request.)
Console.WriteLine(input.Position);
while (input.Position != input.Length)
{
input.CopyToAsync(requestStream);
Console.WriteLine(input.Position);
//bGroundWorker.ReportProgress((int) input.Position);
}
Console.WriteLine(input.Length + "(length)");
Console.WriteLine(input.Position + "(sent)");
//e.Result = input.Position;
}
}
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
response.Close();
Как вы можете видеть, что есть BackgroundWorker, так что я использую CopyToAsync.
Это очень круто, но слишком сложно для меня. Можете ли вы объяснить это чуть позже 'double speed = this.bytesInLastInterval/(this.stopwatch.Elapsed.Ticks/(double) this.interval.Ticks);' – Ismoh
Итак, скорость - это уравнение, которое я, возможно, могу использовать в своем коде который вы можете увидеть в моем редактировании? Или это невозможно с 'input.position' и' input.length'? – Ismoh
Каждый раз, когда что-то записывается в поток, мы отслеживаем количество байтов. Как только наш секундомер превышает наш интервал, мы вычисляем скорость. Пример: Интервал = 1 секунда. Секундомер = 1,1 секунды. BytesInLastInterval = 1100. Очевидно, что мы сделали 1100 байт за 1.1 секунды, поэтому получаем 1100/(1.1/1.0) = 1000 байт в секунду. – Frank