2012-12-10 101 views
1

我試圖讓我的腦袋圍繞backgroundworker和進度條,到目前爲止我已經得到它的工作,但不完全如何我想它的工作。基本上我排序/重命名文件夾,並將它們複製到不同的位置,這個工作和代碼是自我解釋,輸出文件夾生成是預期的。然而,對於我打算通過搜索的每個文件夾,我必須右鍵單擊它以獲取文件數量,然後在代碼中,我必須將progressBar1.Maximum設置爲該值,以便顯示進度條的coreect進度。怎麼可能讓它自動設置文件的數量,因爲它無論如何都會經過每個文件夾?一些文件夾有成千上萬的文件,其他文件有數百萬除此之外,我想添加一個標籤,以便它顯示正在處理的文件的名稱以及進度條更新。BackgroundWorker&Progressbar問題c#Visual Studio 2010

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; 
    } 
} 

回答

2

你可以找到簡單地讀取的GetFiles長度文件編號。

您可以使用表達式:(i * 100)/totalFiles傳遞相對百分比,這樣就沒有必要設置進度的最大值。

您還可以將文件名報告給進度條,並將其作爲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(); 
    } 
} 
+0

這個完美的作品,我不得不更改公式表達我* 200/totalFiles因爲進度條會在中間點正好停在操作完成。我學到了很多謝謝.... – Rg786

+0

太好了,很高興幫助!我看到循環的最後一條指令是totalFiles ++,您必須將其刪除,因爲它不是必需的,並且會破壞公式((i * 100)/ totalFiles)的含義。這就是爲什麼你必須改變100到200.希望它是明確的。 –

1

移動調用的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 ...