Диалог выбора папки в отдельном потоке - C#
Формулировка задачи:
Обьясните, пожалуйста, как починить ошибку при работе с backgroundWorker1? Программа дает пользователю возможность выбрать папку, и на форме получаю информацию об этой папке- размер, названия файлов в папке, когда файлы созданы Т.к. фаилов в папке может быть очень много,т.е обработка занимает много времени, то кинула на форму backgroundWorker1, чтобы все не зависало. Но что-то делаю не так, т.к. получаю ошибку
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.
Спасибо!using System; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections.Generic; namespace FManager { public partial class Form1 : Form { DirectoryInfo di; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } #region "The size of the directory" public long DirSize(DirectoryInfo d) { long Size = 0; // Add file sizes. FileInfo[] fis = d.GetFiles(); foreach (FileInfo fi in fis) { try { Size += fi.Length; } //This exception is made for the passage of folders can not be accessed catch (UnauthorizedAccessException) { ; } } // Add subdirectory sizes. DirectoryInfo[] dis = d.GetDirectories(); foreach (DirectoryInfo di in dis) { try { Size += DirSize(di); } //This exception is made for the passage of folders can not be accessed catch (UnauthorizedAccessException) { ; } } return (Size); } #endregion #region number of files in the folder public int GetNumberofFiles(string folder) { int i = 0; try { i = Directory.GetFiles(folder, "*", SearchOption.AllDirectories).Length; return i; } catch(UnauthorizedAccessException) { ; return 0; } } #endregion #region allfiles public List<string> GetAllFiles(string folder1) { List<string> filesName = new List<string>(); DirectoryInfo dir = new DirectoryInfo(folder1); foreach(FileInfo f in dir.GetFiles("*.*")) { string s = f.FullName; filesName.Add(f.FullName + " " + f.CreationTime.ToString()); } return filesName; } #endregion private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); //GoStart(); } public void GoStart() { if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) //Здесь Error !!! { textBox1.Text = folderBrowserDialog1.SelectedPath; di = new DirectoryInfo(textBox1.Text); textBox2.Text = DirSize(di).ToString(); textBox3.Text = GetNumberofFiles(textBox1.Text).ToString(); List<string> allnames = new List<string>(); allnames = GetAllFiles(textBox1.Text); dgvFiles.DataSource = allnames; for (int i = 0; i < allnames.Count; i++) { listBox1.Items.Add(allnames[i]); dgvFiles.Rows[i].Cells[0].Value = allnames[i]; } } else { MessageBox.Show("Please, choose folder!"); return; } } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { MessageBox.Show("Start"); GoStart(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("E N D !"); }
Решение задачи: «Диалог выбора папки в отдельном потоке»
textual
Листинг программы
foreach(FileInfo f in dir.GetFiles("*.*")) { filesName.Add(f.FullName); creationTime.Add(f.CreationTime.ToString()); lastWriteTime.Add(f.LastWriteTime.ToString()); size.Add(f.Length.ToString()); //вот он, размер файла }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д