В верхней части form1
у меня есть массив строк и имя файла строка:Как я могу получить размер имени файла в байтах, а затем reportprogress?
string[] stringProgressReport = new string[4];
string FileName = "";
Тогда в openfiledialog
я получаю FileName
.
Тогда у меня есть два события:
private void videosInsertRequest_ResponseReceived(Video obj)
{
stringProgressReport[0] = obj.Status.UploadStatus;
backgroundWorker1.ReportProgress(0, 0);
}
И
private void videosInsertRequest_ProgressChanged(IUploadProgress obj)
{
stringProgressReport[1] = obj.Status.ToString();
backgroundWorker1.ReportProgress(0, 1);
double mbSent = ((double)obj.BytesSent)/(1 << 20);
stringProgressReport[2] = mbSent.ToString();
backgroundWorker1.ReportProgress(0, 2);
double percentComplete = ((double)obj.BytesSent)/totalBytes * 100;
stringProgressReport[3] = percentComplete.ToString();
backgroundWorker1.ReportProgress(0, 3);
}
totalBytes
должен быть размер файла в байтах, если я не ошибаюсь с расчетом percentComplete
.
Затем, в конце концов, у меня есть backgroundworker1_progresschanged
событие:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int eventIndex = (int)e.UserState;
if (eventIndex == 0)
{
toolStripStatusLabel1.Text = stringProgressReport[0];
}
else
{
toolStripStatusLabel2.Text = stringProgressReport[1];
}
}
Когда я сообщил о прогрессе двух пунктов из stringProgressReport
в двух событий он работал отлично.
А теперь, что мне делать с IF
в событии backgroundworker1_progresschanged
при отправке 4-х предметов?
И как рассчитать percentComplete
и получить размер файла в байтах?
Получение размера файла в байтах. Кажется, я понял. Я делаю:
using (FileStream fileStream = File.OpenRead(FileName))
{
totalBytes = fileStream.Length;
}
totalBytes
тип long
и глобальный характер. И я делаю это в openfiledialog
сразу после выбора файла.
Если эта часть в порядке, теперь мне нужно решить вторую проблему.
Я попробовал сейчас в backgroundworker_progresschanged
добавить эту строку в ELSE
:
toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]);
Но я получаю следующее исключение на этой линии:
FormatException: Input string was not in a correct format
System.FormatException occurred
HResult=-2146233033
Message=Input string was not in a correct format.
Source=mscorlib
StackTrace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s)
at Youtube_Manager.Form1.backgroundWorker1_ProgressChanged(Object sender, ProgressChangedEventArgs e) in d:\C-Sharp\Youtube-Manager\Youtube-Manager\Youtube-Manager\Form1.cs:line 313
InnerException:
sstan он работает до тех пор пока, когда он получает до 100%, то я получаю исключение на линии: Int eventIndex = (INT) е. UserState; InvalidCastException: invifiedCastException недействителен, и когда я смотрю на UserState, я вижу, что 4 индекса и значение индекса 3 равно 100. Может быть, невозможно отличить int, если это уже int? –
Ошибка System.InvalidCastException HResult = -2147467262 Сообщение = Указанный приказ недействителен. Источник = Youtube-менеджер StackTrace: на Youtube_Manager.Form1.backgroundWorker1_ProgressChanged (Object отправителя, ProgressChangedEventArgs е) в D: \ C-Sharp \ Youtube-менеджер \ Youtube-менеджер \ Youtube-менеджер \ Form1.cs: Строка 306 InnerException: –
- это 'stringProgressReport [3] = percentComplete.ToString();' единственное место, где вы устанавливаете 'stringProgressReport [3]'? Или есть какая-то другая строка кода, которую вы не разместили, которая устанавливает ее в 100? – sstan