簡體   English   中英

我如何總結 int 變量中的變化值? 硬盤上的實際目錄數是多少?

[英]How can i sum a changing values in int variable ? And what is the real number of directories on hard disk?

后台工作者 dowork 事件

string CurrentFileWithPath;
        private void _FileProcessingWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                DirectoryInfo[] MySubDirectories = (DirectoryInfo[])e.Argument;
                for (int i = 0; i < MySubDirectories.GetLength(0); i++)
                {
                    DirectoryInfo MySubDirectory = MySubDirectories[i];

                    List<FileInfo> l = new List<FileInfo>();
                    CountFiles(MySubDirectory, l);

                    int totalFiles = l.Count;
                    object[] CurrentStatus = new object[5];
                    CurrentStatus[3] = i.ToString();
                    CurrentStatus[4] = totalFiles.ToString();
                    _FileProcessingWorker.ReportProgress(0, CurrentStatus);

                    string CurrentDirectory = "Current Directory: " + MySubDirectory.Name;

                    foreach (FileInfo MyFile in l)
                    {
                        CurrentStatus = new object[5];
                        if (_FileProcessingWorker.CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        if (MyFile.Extension.ToLower() == ".cs" || MyFile.Extension.ToLower() == ".vb")
                        {
                            string CurrentFile = "Current File: " + MyFile.Name;
                            string CurrentFileWithPath = MyFile.FullName;

                            CurrentStatus[0] = CurrentDirectory;
                            CurrentStatus[1] = CurrentFile;
                            _FileProcessingWorker.ReportProgress(0, CurrentStatus);

                            List<string> Result = SearchInFile(CurrentFileWithPath, "static class FileShellExtension");

                            if (Result != null && Result.Count > 0)
                            {
                                CurrentStatus[2] = Result;
                                _FileProcessingWorker.ReportProgress(0, CurrentStatus);
                            }
                        }
                    }
                }
            }
            catch (Exception err)
            {
                return;
            }

Progresschanged 事件

private void _FileProcessingWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (typeof(object[]) == e.UserState.GetType())
            {
                object[] StatusMsg = (object[])e.UserState;
                if (5 == StatusMsg.GetLength(0))
                {
                    label2.Text = StatusMsg[4].ToString();
                    label4.Text = StatusMsg[3].ToString();

                    if (StatusMsg[0] != null && StatusMsg[1] != null)
                    {
                        lblCurrentDirectory.Text = StatusMsg[0].ToString();
                        lblStatus.Text = StatusMsg[1].ToString();
                    }
                    if (StatusMsg[2] != null)
                    {
                        if (StatusMsg[2].GetType() == typeof(List<string>))
                        {
                            List<string> l = (List<string>)StatusMsg[2];

                            for (int i = 0; i < l.Count; i++)
                            {
                                ListViewCostumControl.lvnf.Items.Add("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                                w.WriteLine("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                            }
                        }
                    }
                }
            }
        }

CountFiles 方法

private void CountFiles(DirectoryInfo di, List<FileInfo> l)
        {
            try
            {
                l.AddRange(di.EnumerateFiles());
            }
            catch
            {
                string fff = "";
            }

            try
            {
                IEnumerable<DirectoryInfo> subDirs = di.EnumerateDirectories();
                if (subDirs.Count() > 0)
                {
                    foreach (DirectoryInfo dir in subDirs)
                        CountFiles(dir, l);
                }
            }
            catch 
            {
                string yyy = "";
            }
        }

SearchInFile 方法

private List<string> SearchInFile(string fileToSearch, string textToSearch)
        {
            List<string> l = new List<string>();
            try
            {
                foreach (var line in File.ReadAllLines(fileToSearch))
                {
                    if (line.Contains(textToSearch))
                        l.Add(line);
                }
            }
            catch(Exception err)
            {
                string fff = err.ToString();
            }

            return l;
        }

第一個問題是在獲取目錄數時:

private void btnProcess_Click(object sender, EventArgs e)
        {
            btnProcess.Enabled = false;
            btnDirectory.Enabled = false;
            btnCancel.Visible = true;
            btnCancel.Enabled = true;
            btnCancel.Text = "Cancel";
            MyProgressBar.Visible = true;
            _FileProcessingWorker = new BackgroundWorker();
            _FileProcessingWorker.WorkerReportsProgress = true;
            _FileProcessingWorker.WorkerSupportsCancellation = true;
            _FileProcessingWorker.DoWork += new DoWorkEventHandler(_FileProcessingWorker_DoWork);
            _FileProcessingWorker.ProgressChanged += new ProgressChangedEventHandler(_FileProcessingWorker_ProgressChanged);
            _FileProcessingWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_FileProcessingWorker_RunWorkerCompleted);
            string BasePath = lblDirectoryName.Text;
            DirectoryInfo MyDirectory = new DirectoryInfo(BasePath);
            DirectoryInfo[] MySubDirectories = MyDirectory.GetDirectories();
            int SubDirectoryCount = MySubDirectories.GetLength(0);
            MyProgressBar.Minimum = 0;
            MyProgressBar.Step = 1;
            MyProgressBar.Maximum = SubDirectoryCount;
            MyProgressBar.Value = MyProgressBar.Minimum;
            _LastCounter = 0;
            _FileProcessingWorker.RunWorkerAsync(MySubDirectories);
        }

在單擊按鈕中,我正在獲取子目錄。 但是有兩個問題。 在 dowork 事件中,當我在這條線上放置一個斷點時:

for (int i = 0; i < MySubDirectories.GetLength(0); i++)

我看到它包含 409 個目錄。 但是當我在 dowork 事件中向 label4 報告目錄數時

CurrentStatus[3] = i.ToString();

在 progresschanged 事件中

 label4.Text = StatusMsg[3].ToString();

我在label4 408目錄上看到最后。 而在 D:(在這種情況下,我正在處理我的 D:\\ 目錄)當我選擇 Windows 資源管理器中的所有目錄時,右鍵單擊和屬性我只看到 405 個目錄。 那么真正的目錄數是多少? 我應該在 label4 中顯示什么以及多少目錄?

第二個問題是當我報告 dowork 事件中的文件數時:

CurrentStatus[4] = totalFiles.ToString();

並且 in progresschanged 事件將其顯示在 label2 上:

label2.Text = StatusMsg[4].ToString();

問題是 totalFiles 值一直在變化,一旦它是 2 然后它是 768 然后它是 66 然后是 8987 但我想要做的是以某種方式實時求和 totalFiles 中的值所以在 label2 中我會第一次看到例如: 2 然后是 770 然后是 (770+66) 所以我會在 label2 816 中看到......總是看到到目前為止所有值的總和。

最后一個問題是這個循環的progresschanged事件:

for (int i = 0; i < l.Count; i++)
                                {                                    ListViewCostumControl.lvnf.Items.Add("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                                    w.WriteLine("Directory: " + lblCurrentDirectory.Text + "In File: " + lblStatus.Text + l[i]);
                                }

此時在另一個后台工作程序(例如 backgroundworker2 dowork 事件)中的程序中取出並進行此循環可能是邏輯上的某種方式? 如果是這樣怎么辦? 問題是當循環有許多項目要添加到 listView 時,它會使程序掛起直到循環完成。

每次執行

CurrentStatus[4] = totalFiles.ToString();

您正在將狀態值重置為當前處理目錄中的文件數。 這就是為什么這個數字不斷反彈的原因。 相反,我建議:

int thisDirFiles;
thisDirFiles = l.Count;
totalFiles += thisDirFiles;
CurrentStatus[4] = totalFiles.ToString();

現在,當您報告進度時,CurrentStatus[4] 將具有運行總數。

對於您的第二個問題,在我看來,您在報告進展時嘗試做的太多了。 操作 ListView 的成本可能很高,而且您更新 ListView 所花費的時間可能比處理目錄的時間要多,因此您的機器似乎死機了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM