2015-06-19 2 views
0

В верхней части 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: 

ответ

1

Ну , то, как вы сообщаете, является немного необычным, если не сказать больше. Но если я пытаюсь следовать вашей модели, то ваш backgroundWorker1_ProgressChanged, вероятно, хочет, чтобы изменить что-то вроде этого:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    int eventIndex = (int)e.UserState; 

    if (eventIndex == 0) // upload status. 
    { 
     toolStripStatusLabel1.Text = stringProgressReport[0]; 
    } 
    else if (eventIndex == 1) // obj.Status 
    { 
     toolStripStatusLabel2.Text = stringProgressReport[1]; 
    } 
    else if (eventIndex == 2) // mb sent so far 
    { 
     // ??? where do you want to put this ??? = stringProgressReport[2]; 
    } 
    else if (eventIndex == 3) // percent complete 
    { 
     toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]); 
    } 
    else 
    { 
     throw new Exception("Invalid event index: " + eventIndex); 
    } 
} 

А затем, чтобы решить второй вопрос: почему toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]); бросает FormatException потому, что вы пытаетесь для форматирования десятичной дроби. Поскольку вы хотите использовать это как целое число, я предлагаю установить эти 2 строки:

double percentComplete = ((double)obj.BytesSent)/totalBytes * 100; 
stringProgressReport[3] = percentComplete.ToString(); 

...заменив их на это вместо того, чтобы убедиться, что вы на самом деле есть целое число:

int percentComplete = (int)Math.Round(((double)obj.BytesSent)/totalBytes * 100); 
stringProgressReport[3] = percentComplete.ToString(); 
+0

sstan он работает до тех пор пока, когда он получает до 100%, то я получаю исключение на линии: Int eventIndex = (INT) е. UserState; InvalidCastException: invifiedCastException недействителен, и когда я смотрю на UserState, я вижу, что 4 индекса и значение индекса 3 равно 100. Может быть, невозможно отличить int, если это уже int? –

+0

Ошибка System.InvalidCastException HResult = -2147467262 Сообщение = Указанный приказ недействителен. Источник = Youtube-менеджер StackTrace: на Youtube_Manager.Form1.backgroundWorker1_ProgressChanged (Object отправителя, ProgressChangedEventArgs е) в D: \ C-Sharp \ Youtube-менеджер \ Youtube-менеджер \ Youtube-менеджер \ Form1.cs: Строка 306 InnerException: –

+0

- это 'stringProgressReport [3] = percentComplete.ToString();' единственное место, где вы устанавливаете 'stringProgressReport [3]'? Или есть какая-то другая строка кода, которую вы не разместили, которая устанавливает ее в 100? – sstan

 Смежные вопросы

  • Нет связанных вопросов^_^