Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
背景工人及;Progressbar发行c#Visual Studio 2010_C#_Visual Studio 2010_Loops_Progress Bar_Backgroundworker - Fatal编程技术网

背景工人及;Progressbar发行c#Visual Studio 2010

背景工人及;Progressbar发行c#Visual Studio 2010,c#,visual-studio-2010,loops,progress-bar,backgroundworker,C#,Visual Studio 2010,Loops,Progress Bar,Backgroundworker,我试着去了解backgroundworker和progressbar,到目前为止我已经让它工作了,但并不是我想要的工作方式。基本上,我是排序/重命名文件夹,并将它们复制到不同的位置,这是可行的,代码是不言自明的,生成的输出文件夹是预期的。但是,对于我要搜索的每个文件夹,我必须右键单击它以获得文件数,然后在代码中我必须将progressBar1.Maximum设置为该值,以便显示进度条的Corect进度。怎么可能让它自动设置文件的数量,因为它会遍历每个文件夹?一些文件夹有数千个文件,而另一些文件夹

我试着去了解backgroundworker和progressbar,到目前为止我已经让它工作了,但并不是我想要的工作方式。基本上,我是排序/重命名文件夹,并将它们复制到不同的位置,这是可行的,代码是不言自明的,生成的输出文件夹是预期的。但是,对于我要搜索的每个文件夹,我必须右键单击它以获得文件数,然后在代码中我必须将progressBar1.Maximum设置为该值,以便显示进度条的Corect进度。怎么可能让它自动设置文件的数量,因为它会遍历每个文件夹?一些文件夹有数千个文件,而另一些文件夹有数百万个文件。除此之外,我还想添加一个标签,以便它显示正在处理的文件的名称以及progressbar更新

namespace Data_Sorter
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnSelect_Click(object sender, EventArgs e)
    {
        folderBrowserDialog1.ShowDialog();
        tbFilePath.Text = folderBrowserDialog1.SelectedPath.ToString();
    }

    private void btnSort_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int totalFiles = 0;
        foreach (var file in Directory.GetFiles(tbFilePath.Text, "*.txt", SearchOption.AllDirectories))
        {
            backgroundWorker1.ReportProgress(totalFiles);

            string fullFilename = file.ToString();

            string[] pathParts = fullFilename.Split('\\');
            string date = pathParts[6];

            string fileName = pathParts[7];

            string[] partName = fileName.Split('_');

            string point = partName[3];

            Directory.CreateDirectory("Data Sorted Logs\\" + point + "\\" + date + "\\");

            if (Directory.Exists(("Data Sorted Logs\\" + point + "\\" + date + "\\")))
                {
                    string destPath = (point + "\\" + date + "\\");
                    File.Copy(fullFilename, "C:\\Documents and Settings\\PC\\Desktop\\Sorter\\Data Sorter\\bin\\Debug\\Data Sorted Logs\\" + destPath + fileName);                    }
            else
                {
                    MessageBox.Show("destination folder not found " + date + point);
                }

            totalFiles++;
        }
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("Done");
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Maximum = 6777; // set this value at the maximum number of files you want to sort //
        progressBar1.Value = e.ProgressPercentage;
    }
}

将对GetFiles的调用上移,以便获得它返回的数组的长度:

string[] files = Directory.GetFiles(tbFilePath.Text, "*.txt",
                                    SearchOption.AllDirectories));

// Note - you won't be able to set this UI property from DoWork 
// because of cross-thread issues:
// progressbar1.Maximum = files.Length; 

int fileCount = files.Length;   

foreach (var file in files ...

您只需读取GetFiles长度即可找到文件号

您可以使用表达式传递相对百分比:
(i*100)/totalFiles
,这样就不需要设置进度的最大值

您还可以将文件名报告给progressbar,并在progressChanged事件中将其作为UserState传递

请尝试以下代码:

   namespace Data_Sorter
    {
    public partial class Form1 : Form
    {


public Form1()
    {
        InitializeComponent();
    }

    private void btnSelect_Click(object sender, EventArgs e)
    {
        folderBrowserDialog1.ShowDialog();
        tbFilePath.Text = folderBrowserDialog1.SelectedPath.ToString();
    }

    private void btnSort_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int totalFiles = 0;
        string[] files = Directory.GetFiles(tbFilePath.Text, "*.txt", SearchOption.AllDirectories);
        totalFiles = files.Length;
        int i = 0;
        foreach (var file in files)
        {

            backgroundWorker1.ReportProgress((i * 100) / totalFiles, file);
            i++
            string fullFilename = file.ToString();

            string[] pathParts = fullFilename.Split('\\');
            string date = pathParts[6];

            string fileName = pathParts[7];

            string[] partName = fileName.Split('_');

            string point = partName[3];

            Directory.CreateDirectory("Data Sorted Logs\\" + point + "\\" + date + "\\");

            if (Directory.Exists(("Data Sorted Logs\\" + point + "\\" + date + "\\")))
                {
                    string destPath = (point + "\\" + date + "\\");
                    File.Copy(fullFilename, "C:\\Documents and Settings\\PC\\Desktop\\Sorter\\Data Sorter\\bin\\Debug\\Data Sorted Logs\\" + destPath + fileName);                    }
            else
                {
                    MessageBox.Show("destination folder not found " + date + point);
                }

            totalFiles++;
        }
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("Done");
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        progressBar1.Text = e.UserState.ToString();//or yourNewLabel.Text = e.UserState.ToString();
    }
}

这非常有效,我只需将公式表达式更改为I*200/totalFiles,因为当操作完成时,progressbar将在中途完全停止。我学到了很多谢谢你…太好了,很高兴能帮上忙!我看到循环的最后一条指令是totalFiles++,您必须删除它,因为它不是必需的,并且会破坏公式((I*100)/totalFiles)的含义。这就是为什么你必须把100改成200。希望一切都清楚。