簡體   English   中英

為什么在遞歸獲取目錄和文件時將其添加到列表中 <string> 只有目錄而不是文件?

[英]Why when getting directories and files recursive it's adding to the List<string> only directories and not files?

在工作中

DirSearch(textBox3.Text, textBox2.Text, textBox1.Text, worker, e);

textbox3文本包含根目錄。 在這種情況下,textbox2文本包含要搜索的擴展名,而textbox1文本包含要在每個文件中搜索的文本。

DirSearch方法

void DirSearch(string rootDirectory, string filesExtension, string textToSearch, BackgroundWorker worker, DoWorkEventArgs e)
        {
            List<string> filePathList = new List<string>();
            List<string> restrictedFiles = new List<string>();
            int overallfiles = 0;
            int numberoffiles = 0;
            int numberofdirs = 0;

            try
            {
                filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList();
            }
            catch (Exception err)
            {
                string ad = err.ToString();
            }
            foreach (string file in filePathList)
            {
                try
                {
                    _busy.WaitOne();
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        return;
                    }
                    List<MyProgress> prog = new List<MyProgress>();
                    int var = File.ReadAllText(file).Contains(textToSearch) ? 1 : 0;

                    overallfiles++;
                    if (var == 1)
                    {
                        numberoffiles++;
                        prog.Add(new MyProgress { Report1 = file, Report2 = numberoffiles.ToString() });
                        backgroundWorker1.ReportProgress(0, prog);
                    }
                    numberofdirs++;
                    label1.Invoke((MethodInvoker)delegate
                    {
                        label1.Text = numberofdirs.ToString();
                        label1.Visible = true;
                    });
                }
                catch (Exception)
                {
                    restrictedFiles.Add(file);
                    continue;
                }
            }

        }

在DirSearch方法內部,我調用方法SearchAccessibleFilesNoDistinct,在這種方法中,我遇到了問題。

IEnumerable<string> SearchAccessibleFilesNoDistinct(string root, List<string> files)
        {
            if (files == null)
                files = new List<string>();
            if (Directory.Exists(root))
            {
                foreach (var file in Directory.EnumerateFiles(root))
                {
                    string ext = Path.GetExtension(file);
                    if (!files.Contains(file) && ext == textBox2.Text)
                    {
                        files.Add(file);
                    }
                }
                foreach (var subDir in Directory.EnumerateDirectories(root))
                {
                    try
                    {
                        SearchAccessibleFilesNoDistinct(subDir, files);
                        files.Add(subDir);
                    }
                    catch (UnauthorizedAccessException ex)
                    {

                    }
                }
            }
            return files;
        }

最后,我在列表文件中僅看到目錄,而根本看不到文件。

然后,在DirSearch中嘗試搜索文件時,由於沒有文件,只有目錄才成為例外。

我現在檢查,發現在方法SearchAccessibleFilesNoDistinct中,在添加此部分以檢查擴展名之后,問題開始了:

string ext = Path.GetExtension(file);
if (!files.Contains(file) && ext == textBox2.Text)

如果我移除零件:

&& ext == textBox2.Text

因此,如果將是:

如果(!files.Contains(file))

然后它將將所有文件添加到列表文件中。 但是,一旦我添加了此擴展名檢查,它只會向文件添加目錄。 根本沒有文件。

不確定整個方法SearchAccessibleFilesNoDistinct與遞歸方法不能正常工作。

當在方法之上使用斷點時,我看到根目錄是root =“ d:\\ C-Sharp”,並且列表為空。

然后應該開始整個操作。

我認為您可以將它寫得更短一些(在Task.Factory.StartNew內部調用以使其異步),只是快速而骯臟的示例:

var directory = @"D:\Downloads";
var extension = @"*.txt";
var textToSearch = @"abc";
var files = SearchFiles(directory, extension, SearchOption.AllDirectories);
...
private static List<string> SearchFiles(string directory, string extension, string textToSearch)
{
  var results = new List<string>();
  var files = Directory.GetFiles(directory, extension, SearchOption.AllDirectories);
  foreach (var file in files)
  {
    var content = File.ReadAllText(file);
    if (content.Contains(textToSearch))
    {
      results.Add(file);
    }
  }
  return results;
}

textBox2.Text的值為cs (小寫字母)

您使用Path.GetExtension方法獲得了文件擴展名。 該方法返回指定的路徑的擴展名,包括句點“。”。 因此,您應該在文本框中輸入.cs

暫無
暫無

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

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