2015-05-18, 14:57
  #1
Medlem
spuuunits avatar
Medan filer kopieras via File.Copy så vill jag skriva ut hastigheten filerna överförs i, varje sekund.

Möjligtvis klottrigt och amatörmässigt, men här är min kod (C#):
[PHP] private void btnBackup_Click(object sender, EventArgs e) // [ FULL BACKUP ]
{
string error = "B must exist and be empty.";
if (Directory.Exists(B))
{
string[] folders = Directory.GetDirectories(B, "*");
string[] files = Directory.GetFiles(B, "*");
if (folders.Length == 0 && files.Length == 0)
{
btnFull.Enabled = false;
btnFullCancel.Enabled = true;
tim.Start();
wrk.RunWorkerAsync();
}
else { MessageBox.Show(Convert.ToString(error)); }
}
else { MessageBox.Show(Convert.ToString(error)); }
}


private void wrk_DoWork(object sender, DoWorkEventArgs e)
{
// TEMP = skip DONE
// STAGE = 1 - 3
STAGE = 1;
CURRENT_PERCENT = "";
CURRENT_FILE = "Preparing...";
CURRENT_SPEED = "Preparing...";
CURRENT_TIME = "Preparing...";
wrk.ReportProgress(0);
ListFilesAndFolders(A);
if (wrk.CancellationPending) { return; }
for (int i = 0; i < LIST_FOLDERS.Count; i++)
{
if ((B + LIST_FOLDERS[i].Substring(A.Length)).Length >= 248) // 247 = OK, 248 = NOT
{
MessageBox.Show("The path for this folder will become too long:\r\n" + B + LIST_FOLDERS[i].Substring(A.Length) + "\r\n\r\nBackup canceled.");
TEMP = true;
return;
}
}
for (int i = 0; i < LIST_FILES.Count; i++)
{
if ((B + LIST_FILES[i].Substring(A.Length)).Length >= 260) // 259 = OK, 260 = NOT
{
MessageBox.Show("The path for this file will become too long:\r\n" + B + LIST_FILES[i].Substring(A.Length) + "\r\n\r\nBackup canceled.");
TEMP = true;
return;
}
}
if (wrk.CancellationPending) { return; }




A_SIZE = FolderSize(A);
B_SIZE = 0;
for (int i = 0; i < LIST_FOLDERS.Count; i++) { Directory.CreateDirectory(B + LIST_FOLDERS[i].Substring(A.Length)); } // folder tree creation
int percent = 0;
for (int i = 0; i < LIST_FILES.Count; i++)
{
if (wrk.CancellationPending) { return; }
if (i == 0)
{
START_TIME = DateTime.Now;
STAGE = 2;
CURRENT_PERCENT = Convert.ToString(percent) + "%";
CURRENT_FILE = PathToName(LIST_FILES[i]);
CURRENT_SPEED = "";
CURRENT_TIME = "";
wrk.ReportProgress(percent);
}
// HÄR SKER KOPIERINGEN
File.Copy(LIST_FILES[i], B + LIST_FILES[i].Substring(A.Length));
B_SIZE += new FileInfo(LIST_FILES[i]).Length;
percent = Convert.ToInt32(((B_SIZE / A_SIZE) * 100));
if (i != LIST_FILES.Count - 1)
{
CURRENT_PERCENT = Convert.ToString(percent) + "%";
CURRENT_FILE = PathToName(LIST_FILES[i + 1]);
}
wrk.ReportProgress(percent);
}
}


private void wrk_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbr1.Value = e.ProgressPercentage;
lblFullPercent.Text = CURRENT_PERCENT;
lblFullFile.Text = CURRENT_FILE;
if (STAGE == 1 || STAGE == 2)
{
lblFullSpeed.Text = CURRENT_SPEED;
lblFullTime.Text = CURRENT_TIME;
if (STAGE == 2) { STAGE = 3; }
}
}


private void wrk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
tim.Stop();
btnFull.Enabled = true;
btnFullCancel.Enabled = false;
lblFullFile.Text = "-";
lblFullSpeed.Text = "-";
lblFullTime.Text = "-";
if (TEMP == false)
{
pbr1.Value = 100;
lblFullPercent.Text = "100%";
MessageBox.Show(Convert.ToString("DONE"));
}
else { TEMP = false; }
pbr1.Value = 0;
lblFullPercent.Text = "";
}


private void tim_Tick(object sender, EventArgs e)
{
if (STAGE == 3)
{
Random rnd = new Random();
lblFullSpeed.Text = Convert.ToString(rnd.Next(1, 100));
lblFullTime.Text = Convert.ToString(rnd.Next(1, 100));

// HÄR SKA HASTIGHETEN BERÄKNAS TILL lblFullSpeed.Text
// HÄNDER VARJE SEKUND

}
}


private void btnStop_Click(object sender, EventArgs e)
{
tim.Stop();
btnFull.Enabled = false;
btnFullCancel.Enabled = false;
pbr1.Value = 0;
lblFullPercent.Text = "";
lblFullFile.Text = "-";
lblFullSpeed.Text = "-";
lblFullTime.Text = "-";
TEMP = true;
wrk.CancelAsync();
}


private void btnClear_Click(object sender, EventArgs e)
{
Clear(B);
}[/PHP]

Under tim_Tick (långt nere) så ska hastigheten beräknas och skrivas ut i lblFullSpeed.Text.

Vad jag förstått så går det inte att få fram hur mycket av en fil som är överförd vid ett tillfälle (tex: 4GB av filmen är klara, av filmens totala 16GB). Utan den siffran så går det inte att räkna ut hastigheten i mitt tänk... Men jag är väldigt dålig på matte också.

Så, är det någon som har en idé hur jag kan beräkna överföringshastigheten i tim_Tick?
Citera
2015-05-18, 19:09
  #2
Medlem
tj.s avatar
Denna kanske kan hjälpa.
Citera
2015-05-18, 20:47
  #3
Medlem
spuuunits avatar
Tror det där är time remaining och inte speed, men inte säker. Förstår inte riktigt hur jag kan testa koden... Tror inte det är skrivit i Forms som jag kör.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in