【问题标题】:How can i make the method to return a List of files only and not also directories?如何使该方法仅返回文件列表而不返回目录?
【发布时间】:2016-07-07 20:12:16
【问题描述】:

在构造函数中。 filePathList 是列表

filePathList = SearchAccessibleFilesNoDistinct(rootDirectory, null).ToList();

还有 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;
        }

然后我循环遍历 List filePathList

foreach (string file in filePathList)
            {
                try
                {
                    _busy.WaitOne();
                    if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        return;
                    }

                    bool reportedFile = false;

                    for (int i = 0; i < textToSearch.Length; i++)
                    {
                        if (File.ReadAllText(file).IndexOf(textToSearch[i], StringComparison.InvariantCultureIgnoreCase) >= 0)
                        {
                            resultsoftextfound.Add(file + "  " + textToSearch[i]);
                            if (!reportedFile)
                            {
                                numberoffiles++;
                                MyProgress myp = new MyProgress();
                                myp.Report1 = file;
                                myp.Report2 = numberoffiles.ToString();
                                myp.Report3 = textToSearch[i];
                                backgroundWorker1.ReportProgress(0, myp);
                                reportedFile = true;
                            }
                        }
                    }
                    numberofdirs++;
                    label1.Invoke((MethodInvoker)delegate
                    {
                        label1.Text = numberofdirs.ToString();
                        label1.Visible = true;
                    });
                }
                catch (Exception)
                {
                    restrictedFiles.Add(file);
                    numberofrestrictedFiles ++;
                    label11.Invoke((MethodInvoker)delegate
                    {
                        label11.Text = numberofrestrictedFiles.ToString();
                        label11.Visible = true;
                    });
                    continue;
                }

问题在于,在 catch 部分中,restrictedFiles 只是目录而不是文件。由于 filePathList 包含文件和目录,并且当它试图在目录中搜索时,它会被抓住。它不是受限制的文件,它只是目录,根本不是文件。

这就是为什么我认为 SearchAccessibleFilesNoDistinct 方法应该只返回没有目录的文件作为项目。

例如在 filePathList 中我在索引 0 中看到:

c:\temp

在索引 1 中

c:\temp\help.txt

索引 0 中的第一项将作为受限文件进入 catch,第二项不会。

【问题讨论】:

  • 只是不要将子目录添加到列表中。您有一行files.Add(subDir);,它将子目录名称添加到列表中。只需删除该行。

标签: c# .net winforms


【解决方案1】:

你有这个循环来搜索搜索子目录:

            foreach (var subDir in Directory.EnumerateDirectories(root))
            {
                try
                {
                    SearchAccessibleFilesNoDistinct(subDir, files);
                    files.Add(subDir);  <--- remove this line
                }
                catch (UnauthorizedAccessException ex)
                {
                    // ...
                }
            }

删除将子目录添加到文件列表的行。我已经在上面的代码中做了标记。

【讨论】:

    【解决方案2】:

    你在找吗:

            Directory.GetFiles(rootDir,"*.*", SearchOption.AllDirectories);
    

    ?将 . 更改为仅屏蔽表单文本框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2014-11-25
      • 2012-07-22
      相关资源
      最近更新 更多