如何获取以字节为单位的文件名大小,然后报告进度

本文关键字:文件名 然后 报告 为单位 何获取 获取 字节 | 更新日期: 2023-09-27 17:56:57

form1的顶部,我有一个字符串数组和一个字符串文件名:

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中的两个项目的进展时,它工作正常。

但是现在,在报告4个项目时,我应该如何处理backgroundworker1_progresschanged事件中的IF

以及如何计算percentComplete并获取文件大小(以字节为单位)?

获取文件大小(以字节为单位)。我想我明白了。我正在做:

using (FileStream fileStream = File.OpenRead(FileName))
{
    totalBytes = fileStream.Length;
}

totalByteslong和全局的类型。我在选择文件后立即在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: 

如何获取以字节为单位的文件名大小,然后报告进度

好吧,至少可以说,您的报告方式有点不寻常。 但是如果我尝试遵循您的模式,那么您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();

。通过将它们更改为 this 以确保您确实有一个整数:

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