Диалог выбора папки в отдельном потоке - 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());  //вот он, размер файла
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.667 из 5
Похожие ответы