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