login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[C#] Bereken hoelang file moet uploaden (Opgelost)

Offline Ultimatum - 03/12/2008 16:28 (laatste wijziging 03/12/2008 16:28)
Avatar van UltimatumPHP expert Ik heb nu een werkende upload functie, maar zou graag willen dat er ook word berekend hoelang het uploaden nog ongeveer duurt. Ik dacht door te kijken naar de huidige upload snelheid en aan de hand daarvan kan ik wel berekenen hoelang het nog duurt. En ik heb ook een buffer dus zo kan ik steeds wat wijzigingen aanbrengen aan de upload tijd als de upload snelheid wijzigd. Maar heb geen idee hoe ik het moet doen en met FtpWebResponse bevriest mijn applicatie steeds (Misschien gebruik ik het verkeerd).

Dit is de functie die ik nu heb, hopeelijk kan iemand me helpen.
  1. public void uploadFile(string directory, string file)
  2. {
  3. if (checkIfDirExists(directory) == false)
  4. {
  5. createDirectory(directory);
  6. }
  7.  
  8. if (checkIfFileExists(directory, Path.GetFileName(file)) == false)
  9. {
  10. FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(ConfigurationSettings.AppSettings["ftp_server"] + "/" + directory + "/" + Path.GetFileName(file));
  11. Request.Method = WebRequestMethods.Ftp.UploadFile;
  12. Request.Credentials = new NetworkCredential(ConfigurationSettings.AppSettings["ftp_user"], ConfigurationSettings.AppSettings["ftp_pass"]);
  13.  
  14. Request.UsePassive = true;
  15. Request.UseBinary = true;
  16. Request.KeepAlive = false;
  17.  
  18. FileStream fs = File.OpenRead(file);
  19. int dataLength = (int)fs.Length;
  20. int bufferLength = 2048;
  21. byte[] buffer = new byte[bufferLength];
  22.  
  23. progressBarStatus.Value = 0;
  24. progressBarStatus.Maximum = dataLength;
  25. tbProgress.Text = "0%";
  26.  
  27. tbStatus.Text = "Attachment uploaden (" + Path.GetFileName(file) + ")";
  28. Application.DoEvents();
  29.  
  30. Stream strm = Request.GetRequestStream();
  31.  
  32. int bytesRead = fs.Read(buffer, 0, buffer.Length);
  33.  
  34. while (true)
  35. {
  36. if (bytesRead == 0)
  37. {
  38. progressBarStatus.Value = progressBarStatus.Maximum;
  39. tbProgress.Text = "100%";
  40.  
  41. Application.DoEvents();
  42.  
  43. strm.Close();
  44. fs.Close();
  45. break;
  46. }
  47. else
  48. {
  49. strm.Write(buffer, 0, bytesRead);
  50. bytesRead = fs.Read(buffer, 0, bufferLength);
  51.  
  52. if (progressBarStatus.Value + bytesRead <= progressBarStatus.Maximum)
  53. {
  54. progressBarStatus.Value += bytesRead;
  55.  
  56. int procentStep = (progressBarStatus.Value * 100) / dataLength;
  57. tbProgress.Text = procentStep.ToString() + "%";
  58.  
  59. progressBarStatus.Refresh();
  60. Application.DoEvents();
  61. }
  62. }
  63. }
  64.  
  65. FtpWebResponse Response = (FtpWebResponse)Request.GetResponse();
  66.  
  67. // MessageBox.Show("Upload File Complete, status " + response.StatusDescription);
  68. Response.Close();
  69. }
  70. else
  71. {
  72. filesSkipped++;
  73. // lbItem.Text = "Bestandsnaam: Bestand overgeslagen";
  74. }
  75. }

8 antwoorden

Gesponsorde links
Offline marten - 04/12/2008 09:59
Avatar van marten Beheerder Misschien heb je hier wat aan:

http://www.exam...Events.asp
Offline Ultimatum - 04/12/2008 10:12
Avatar van Ultimatum PHP expert Daar word helaas niet bijgehouden hoelang het uploaden nog gaat duren of wat de huidige upload snelheid is (Of ik lees er overheen)
Offline marten - 04/12/2008 10:18
Avatar van marten Beheerder Ik denk dat je er echt overheen kijkt. Dit is een code snippet van Chilkat. Dit is een soort framework. Dus even iets beter lezen 
Offline Ultimatum - 04/12/2008 10:33 (laatste wijziging 04/12/2008 10:46)
Avatar van Ultimatum PHP expert Ja dat weet ik wel, ben ik wel vaker tegengekomen. Maar zal nog wel eens kijken . Maar op welke regel zie jij dan dat ze de upload snelheid kijken? Of bedoel je gewoon deze class te gebruiken want die is namelijk niet gratis.
Offline Abbas - 05/12/2008 16:04 (laatste wijziging 05/12/2008 16:06)
Avatar van Abbas Gouden medaille

Crew .NET
Als je even op Google bijvoorbeeld zoekt naar calculate remaining download time C# heb je vrij snel een aantal goede links. Hier is er een waar je volgend mij wel verder mee kan: klik
Offline Ultimatum - 05/12/2008 16:08 (laatste wijziging 05/12/2008 16:09)
Avatar van Ultimatum PHP expert Moet toegeven, dat is 1 van de weinige zoektermen waar ik niet aan had gedacht . Maar over jouw link, die had ik ook gevonden maar er word daar javascript gebruikt en ik gebruik C# forms (mss moeten vermelden ), dus hoe kan ik dat javascript gedeelte ombouwen zodat het in een form applicatie werkt?

En wil reallife berekenen, dus moet ook de huidige upload snelheid te pakken krijgen, hoe doe ik dat dan? 
Offline Abbas - 05/12/2008 16:27
Avatar van Abbas Gouden medaille

Crew .NET
Die JavaScript en C# code zijn twee aparte dingen, het is niet dat ze samen hoeven worden gebruikt! 

Hm, maar ik weet iets, het is een beetje m'n eigen logica maar ik denk dat het wel kan werken. Als je de volgende dingen kan berekenen heb je wat je nodig hebt:
- totale grootte
- verstreken tijd (sinds het downloaden gestart is)
- de grootte die al gedownload is

Hier mee kunnen we de snelheid berekenen, die variabel is, de totale tijd en de resterende tijd. Wel nu, je maakt dan een formule om de resterende tijd te berekenen, in stapjes. Stel:
- grootte: 100kb
- verstreken tijd: 4sec
- reeds gedownload: 40kb

De snelheid op dat moment is dan:
40kb/4sec = 10kb/sec

De resterende tijd is dan, de totale duur min de verstreken duur. De totale duur is:
100kb aan 10kb/sec = 10sec

De resterende tijd is dus:
10sec - 4sec = 6sec

Dit steek je in een functie ofzo die telkens aangeroepen wordt en waardoor alles opnieuw berekend wordt. Dit is net hetzelfde als bij Windows. Hopelijk ben je hier wat mee! 
Offline Ultimatum - 05/12/2008 16:40 (laatste wijziging 08/12/2008 11:10)
Avatar van Ultimatum PHP expert Ja denk het wel, zo helemaal mooi zijn als jij je logica in de praktijk kan steken, maar ga alvast bezig met die functie 

Want ik heb deze functie
  1. private int getDownloadTime(int dataLength, int bytesRead, int startTime)
  2. {
  3. int difference = (DateTime.Now.Millisecond - startTime);
  4. int kbSec = (bytesRead / difference);
  5. int totalTime = (dataLength / kbSec);
  6.  
  7. return (kbSec - difference);
  8. }


Maar dan krijg ik soms - seconden enzo . Zo gebruik ik het.
  1. int bytesRead = fs.Read(buffer, 0, buffer.Length);
  2.  
  3. while (true)
  4. {
  5. if (bytesRead == 0)
  6. {
  7. progressBarStatus.Value = progressBarStatus.Maximum;
  8. tbProgress.Text = "100%";
  9.  
  10. Application.DoEvents();
  11.  
  12. strm.Close();
  13. fs.Close();
  14. break;
  15. }
  16. else
  17. {
  18. label1.Text = getDownloadTime(dataLength, bytesRead, startTime).ToString() + " seconden";
  19.  
  20. strm.Write(buffer, 0, bytesRead);
  21. bytesRead = fs.Read(buffer, 0, bufferLength);
  22.  
  23. if (progressBarStatus.Value + bytesRead <= progressBarStatus.Maximum)
  24. {
  25. progressBarStatus.Value += bytesRead;
  26.  
  27. int procentStep = (progressBarStatus.Value * 100) / dataLength;
  28. tbProgress.Text = procentStep.ToString() + "%";
  29.  
  30. progressBarStatus.Refresh();
  31. Application.DoEvents();
  32. }
  33. }


Edit:
Ik heb het nu zo opgelost, Titjes bedankt voor je gedachten .
  1. private void getDownloadTime(ProgressBar progressBarStatus, DateTime startTime)
  2. {
  3. TimeSpan timespent = DateTime.Now - startTime;
  4. int remainingTime = Convert.ToInt32((timespent.TotalSeconds / progressBarStatus.Value * (progressBarStatus.Maximum - progressBarStatus.Value)));
  5. if (remainingTime < 60)
  6. {
  7. tbRemaining.Text = remainingTime.ToString() + " seconden";
  8. }
  9. else if ((remainingTime / 60) == 1)
  10. {
  11. tbRemaining.Text = (remainingTime / 60).ToString() + " minuut";
  12. }
  13. else
  14. {
  15. tbRemaining.Text = (remainingTime / 60).ToString() + " minuten";
  16. }
  17. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.209s