-1

我制作了一个程序来扫描用户选择的文件夹,它将搜索 MP3 文件和 WAV 文件,然后它会计算这些文件的总大小,但是当它执行所有这些操作时,程序无响应标签将不会更新或只有一半并且窗口不能拖动。

我该如何解决这个问题?

下载我的程序的链接:LINK 病毒总数的链接:LINK

编辑 :

这是检查文件大小的代码:

    public string testFileSize(String dir)
    {
        if (MFILE_OPTION_SUBFOLDER_CHECKBOX.Checked == true)
        {
            double totalFileSize = 0;

            if (MFILE_OPTION_MP3_CHECKBOX.Checked == true)
            {
                string[] files = System.IO.Directory.GetFiles(dir, "*.mp3", SearchOption.AllDirectories);
                foreach (string fileName in files)
                {
                    FileInfo fi = new FileInfo(fileName);

                    double fileSize = fi.Length;
                    totalFileSize += fileSize;
                }
            }

            if (MFILE_OPTION_WAV_CHECKBOX.Checked == true)
            {
                string[] files = System.IO.Directory.GetFiles(dir, "*.wav", SearchOption.AllDirectories);
                foreach (string fileName in files)
                {
                    FileInfo fi = new FileInfo(fileName);

                    double fileSize = fi.Length;
                    totalFileSize += fileSize;
                }
            }

            totalFileSize = Math.Round((totalFileSize / 1024f) / 1024f, 2);
            return totalFileSize.ToString() + " MB";
        }
        else
        {
            double totalFileSize = 0;

            if (MFILE_OPTION_MP3_CHECKBOX.Checked == true)
            {
                string[] files = System.IO.Directory.GetFiles(dir, "*.mp3", SearchOption.TopDirectoryOnly);
                foreach (string fileName in files)
                {
                    FileInfo fi = new FileInfo(fileName);

                    double fileSize = fi.Length;
                    totalFileSize += fileSize;
                }
            }

            if (MFILE_OPTION_WAV_CHECKBOX.Checked == true)
            {
                string[] files = System.IO.Directory.GetFiles(dir, "*.wav", SearchOption.TopDirectoryOnly);
                foreach (string fileName in files)
                {
                    FileInfo fi = new FileInfo(fileName);

                    double fileSize = fi.Length;
                    totalFileSize += fileSize;
                }
            }

            totalFileSize = Math.Round((totalFileSize / 1024f) / 1024f, 2);
            return totalFileSize.ToString() + " MB";
        }
    }

这是我尝试过的,但它们具有如上所示的所有文件类型^^

                if (MFILE_OPTION_WAV_CHECKBOX.Checked == true)
            {
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += (s, e) =>
                {
                    string[] files = System.IO.Directory.GetFiles(dir, "*.wav", SearchOption.TopDirectoryOnly);
                    foreach (string fileName in files)
                    {
                        FileInfo fi = new FileInfo(fileName);

                        double fileSize = fi.Length;
                        totalFileSize += fileSize;
                    }
                };

                bw.RunWorkerAsync();
            }

但这如何返回 0 MB?

4

2 回答 2

3

您应该BackgroundWorker为此使用 a 。如果您提供一些代码,我们可以为您提供更好的帮助。到目前为止,我只能给你这个:

BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s,e) =>
   {
      // Do your work
   };

bw.RunWorkerAsync();

基于您的代码的示例:

if (MFILE_OPTION_WAV_CHECKBOX.Checked == true)
        {
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += (s, e) =>
            {
                string[] files = System.IO.Directory.GetFiles(dir, "*.wav", SearchOption.TopDirectoryOnly);
                foreach (string fileName in files)
                {
                    FileInfo fi = new FileInfo(fileName);

                    double fileSize = fi.Length;
                    totalFileSize += fileSize;
                }
            };

            bw.RunWorkerCompleted += (s,e) =>
            {
                    //Update GUI
             }

            bw.RunWorkerAsync();
        }
于 2013-07-03T16:12:36.573 回答
1

您需要使用 aBackgroundWorker或类似的东西。

您的表单没有响应,因为您在与用户界面相同的线程中执行主要工作,这就是它没有响应的原因。

如果您想在搜索文件的过程中更新您的用户界面,您还需要使用Invokes来更改值

于 2013-07-03T16:11:20.257 回答