1

下面的代码实际上做了我想要它做的事情,但是我正在努力使其达到最佳状态,并且由于我仍在学习 BackgroundWorker 等,我想你可以给我一些提示。问题是我可以运行该程序,但是因为它是一个相当长的操作(每个文本文件超过 1000 行),它只会在程序完成之前很好地更新进度条或标签。有 2 个进度条,一个用于处理的文本文件数,另一个用于处理过程中读取的文本文件的行数。

namespace myParser
{
    public partial class Form1 : Form
{

    string filePath;
    string[] files;

    public Form1()
    {
        InitializeComponent();

        pbFilesProcessed.Visible = false;
        pbLinesProcessed.Visible = false;
        btnParse.Visible = false;
        lbProcessedFiles.Visible = false;
        lbProcessedLines.Visible = false;
    }

    private void btnOpen_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            //counts the number of files in the folder
            files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

            filePath = folderBrowserDialog1.SelectedPath.ToString();

            char[] delimiterChars = { '\\' };
            string[] filePathParts = filePath.Split(delimiterChars);

            string folder = filePathParts[4];

            tbFolderName.Text = folder;

            btnParse.Visible = true;
        }
    }

    private void btnParse_Click(object sender, EventArgs e)
    {
        btnParse.Visible = false;

        lbProcessedFiles.Visible = true;
        pbFilesProcessed.Visible = true;
        lbProcessedLines.Visible = true;
        pbLinesProcessed.Visible = true;
        lbProcessedLines.Text = "Lines: 0 / 0";

        int fileCount = 1;

        foreach (var csvFile in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
        {
            pbFilesProcessed.Maximum = Convert.ToInt32(files.Length.ToString());

            string fileName = "Waveforms.csv";

            int lineCount = 0;

            string lines;

            string newLines;              

            string csvFullFilePath = csvFile.ToString();
            string[] filePathSplit = csvFullFilePath.Split('\\');
            string pointName = filePathSplit[4].ToString();

            string[] pathDirectionSplit = filePathSplit[5].ToString().Split('_');
            string[] swingDirectionSplit = pathDirectionSplit[3].Split('.');
            string swingDirection = swingDirectionSplit[0];


            var numberOfLines = File.ReadLines(csvFile).Count();

            using (StreamReader r = new StreamReader(csvFile))
            {
                while ((lines = r.ReadLine()) != null)
                {
                    pbLinesProcessed.Maximum = Convert.ToInt32(numberOfLines.ToString());

                    if (lineCount == 0)
                    {
                        lines.Remove(0);
                        lineCount++;
                    }
                    else
                    {
                        newLines = Regex.Replace(lines, ",{2,}", ",").ToString();
                        File.AppendAllText(@"Simulator\\" + fileName, pointName + "," + swingDirection + "," + newLines + System.Environment.NewLine);

                        pbLinesProcessed.PerformStep();
                        lbProcessedLines.Text = "Lines: " + lineCount + "/" + Convert.ToInt32(numberOfLines.ToString()); 

                        lineCount++;                                  
                    }
                }
                r.Close();
            }
            pbFilesProcessed.PerformStep();
            lbProcessedFiles.Text = "Files: " + fileCount.ToString() + "/" + files.Length.ToString();
            fileCount++;
        }
        btnParse.Visible = false;
        MessageBox.Show("Done");
    }  
}

}

4

2 回答 2

2

对,一个小时左右后,这就是我所做的。不是最优雅的,因为我仍然是新手 感谢 nim(MSDN 链接)。但是,我无法获得进度条上显示的正确进度量.....

namespace myParser
{
public partial class Form1 : Form
{
    string filePath;
    string[] files;
    int fileCount = 0;
    int numberOfFiles;
    int lineCount = 0;
    int numberOfLines;

    public Form1()
    {
        InitializeComponent();

        pbFilesProcessed.Visible = false;
        pbLinesProcessed.Visible = false;
        btnParse.Visible = false;
        lbProcessedFiles.Visible = false;
        lbProcessedLines.Visible = false;
    }

    private void btnOpen_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            //counts the number of files in the folder
            files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

            filePath = folderBrowserDialog1.SelectedPath.ToString();

            char[] delimiterChars = { '\\' };
            string[] filePathParts = filePath.Split(delimiterChars);

            string folder = filePathParts[4];

            tbFolderName.Text = folder;

            btnParse.Visible = true;
        }
    }

    private void btnParse_Click(object sender, EventArgs e)
    {
        btnParse.Visible = false;
        btnOpen.Visible = false;

        lbProcessedFiles.Visible = true;
        pbFilesProcessed.Visible = true;
        lbProcessedLines.Visible = true;
        pbLinesProcessed.Visible = true;
        lbProcessedLines.Text = "Lines: 0 / 0";

        pbFilesProcessed.Maximum = Convert.ToInt32(files.Length.ToString());

        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

        foreach (var csvFile in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
        {
            numberOfFiles = Convert.ToInt32(files.Length.ToString());

            string fileName = "Waveforms.csv";
            lineCount = 0;
            string lines;
            string newLines;
            string csvFullFilePath = csvFile.ToString();
            string[] filePathSplit = csvFullFilePath.Split('\\');
            string pointName = filePathSplit[4].ToString();
            string[] pathDirectionSplit = filePathSplit[5].ToString().Split('_');
            string[] swingDirectionSplit = pathDirectionSplit[3].Split('.');
            string swingDirection = swingDirectionSplit[0];

            numberOfLines = File.ReadLines(csvFile).Count();

            using (StreamReader r = new StreamReader(csvFile))
            {
                while ((lines = r.ReadLine()) != null)
                {
                    if (lineCount == 0)
                    {
                        lines.Remove(0);
                        lineCount++;
                    }
                    else
                    {
                        newLines = Regex.Replace(lines, ",{2,}", ",").ToString();
                        File.AppendAllText(@"Simulator\\" + fileName, pointName + "," + swingDirection + "," + newLines + System.Environment.NewLine);
                        backgroundWorker1.ReportProgress(lineCount);
                        lineCount++;
                    }
                }
                r.Close();
            }
            backgroundWorker1.ReportProgress(fileCount);
            fileCount++;
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbFilesProcessed.PerformStep();
        lbProcessedFiles.Text = "Files: " + fileCount.ToString() + "/" + files.Length.ToString();
        pbLinesProcessed.PerformStep();
        lbProcessedLines.Text = "Lines: " + lineCount + "/" + Convert.ToInt32(numberOfLines.ToString());
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnParse.Visible = false;
        MessageBox.Show("Done");
        btnOpen.Visible = true;
    }  
}

}

于 2013-08-20T13:37:02.017 回答
0

请参阅有关 BackgroundWorker 的 MSDN 文档

页面底部附近有一个非常简短但很好的示例代码。

于 2013-08-20T12:56:05.977 回答