Как я могу использовать Task Asyn c Await для рекурсивного чтения содержимого файлов из нескольких каталогов? - PullRequest
0 голосов
/ 29 мая 2020
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ProcessRead().Wait();
        }

        static async Task ProcessRead()
        {
            await Task.Run(() =>
            {
                IEnumerable<string> fileEntries = Directory.EnumerateFiles(@"Directory");
                int count = 0;
                foreach (string fname in fileEntries)
                {
                    try
                    {
                        count++;
                        string text = File.ReadAllText(fname);
                        Console.WriteLine(text);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

                Console.WriteLine(count);
            });
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Это работает, но только для указанного каталога в EnumerateFiles. но я хочу, чтобы все файлы во всех каталогах были рекурсивными.

Например, если я помещаю каталог windows:

IEnumerable<string> fileEntries = Directory.EnumerateFiles(@"c:\windows");

, я хочу, чтобы он прочитал содержимое всех файлы в каталоге windows, а также во всех подкаталогах в windows. Таким образом, он будет читать все содержимое файлов в данном каталоге root и все его подкаталоги рекурсивно.

Теперь это код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Schema;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ProcessRead().Wait();
        }

        static async Task ProcessRead()
        {
            await Task.Run(() =>
            {
                IEnumerable<string> fileEntries = Directory.EnumerateFiles(@"Directory","", SearchOption.AllDirectories);
                int count = 0;
                foreach (string fname in fileEntries)
                {
                    try
                    {
                        count++;
                        string text = File.ReadAllText(fname);
                        Console.WriteLine(text);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

                Console.WriteLine(count);
            });
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

EnumerationOptions.RecurseSubdirectories не существуют конечно, если это потому, что я использую. net 4.7.2

Что я сделал не так, что EnumerationOptions.RecurseSubdirectories не существует?

1 Ответ

1 голос
/ 29 мая 2020

Используйте перегруженный метод для Directory.EnumerateFiles:

public static System.Collections.Generic.IEnumerable<string> EnumerateFiles (string path, string searchPattern, System.IO.EnumerationOptions enumerationOptions);

https://docs.microsoft.com/en-us/dotnet/api/system.io.directory.enumeratefiles?view=netcore-3.1

Укажите ваши EnumerationOptions как EnumerationOptions.RecurseSubdirectories.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...