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?
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?