Используя mimekit.mimemessage для загрузки файлов eml с жесткого диска, как я могу загрузить только текст?

Вот как я использую его сегодня

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    int counter = 0;
    MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
    MimeKit.MimeMessage loadedMessage = null;
    DirectoryInfo di = new DirectoryInfo(emailsDirectory);
    FileInfo[] files = di.GetFiles();
    for (int i = 0; i < files.Length; i++)
    {
        string uid = seenUids[0];
        loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName);
        MimekitallLoadedMessages.Add(loadedMessage);
        downloaded.Add(seenUids[i]);
        counter += 1;
        int nProgress = counter * 100 / files.Length;
        backgroundWorker2.ReportProgress(nProgress);
    }
}

Метод Load просто загружает все сообщение. Но я блуждаю, могу ли я загрузить, например, тему каждого сообщения и добавить его, например, в listView, чтобы пользователь позже мог выбрать конкретное электронное письмо, чтобы загрузить все его содержимое, такое как html или все содержимое тела.

Таким образом, загрузка только темы и создание списка всех электронных писем в listView ускорит загрузку сообщений. У меня около 6000 файлов eml на жестком диске.

Загрузка всех файлов и добавление всех сообщений в listView может занять некоторое время. Вместо этого, возможно, загрузка/анализ только текста может быть быстрее?

Является ли это возможным ? А логика? Может быть, когда я загружаю сообщения в первый раз, мне следует создать текстовый файл со всеми темами каждого письма, а затем при запуске моей программы просто читать строки из текстового файла, каждая строка является темой?

ОБНОВИТЬ

Это dowork событие сейчас:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            MimeKit.HeaderList loaded = new MimeKit.HeaderList();
            int counter = 0;
            MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
            MimeKit.MimeMessage loadedMessage = null;
            DirectoryInfo di = new DirectoryInfo(emailsDirectory);
            FileInfo[] files = di.GetFiles();
            for (int i = 0; i < files.Length; i++)
            {
                string uid = seenUids[0];
                loaded = MimeKit.HeaderList.Load(files[i].FullName);
                var subject = loaded[MimeKit.HeaderId.Subject];
                downloaded.Add(seenUids[i]);
                counter += 1;
                int nProgress = counter * 100 / files.Length;
                backgroundWorker2.ReportProgress(nProgress, subject);
            }
         }

И событие progresschanged, как я обновляю элемент управления listView:

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbt1.Value = e.ProgressPercentage;
            pbt1.Text = e.ProgressPercentage.ToString() + "%";
            pbt1.Invalidate();
            if (e.UserState != null)
            {

                ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[]
            {
                e.UserState.ToString()
            }));
            }
         }

person Sharon Gabriel    schedule 04.06.2016    source источник
comment
Так вы просто хотите читать тему из этих сообщений?   -  person Yacoub Massad    schedule 04.06.2016
comment
Вы правы, и ваша идея кода Yacoub хороша и быстра, проблема заключается в обновлении пользовательского интерфейса в событии progresschanged. Я пытаюсь добавить тему в виде строковых элементов в listView в режиме реального времени, но обновление listView делает все это медленным и негладким.   -  person Sharon Gabriel    schedule 05.06.2016
comment
Я только что придумал и обновил свой вопрос тем, что пробовал до сих пор.   -  person Sharon Gabriel    schedule 05.06.2016
comment
Вы используете .NET ›= 4.5?   -  person Yacoub Massad    schedule 05.06.2016
comment
Фоновый рабочий считается устаревшим. Вы можете использовать async/await, чтобы сделать то, что вы пытаетесь сделать, в меньшем количестве строк.   -  person Yacoub Massad    schedule 05.06.2016
comment
В чем именно проблема с интерфейсом? Список мерцает? Попробуйте добавить несколько элементов одновременно. Например. вызовите ReportProgress для каждых 10 или 20 элементов.   -  person Yacoub Massad    schedule 05.06.2016


Ответы (1)


Вы можете анализировать заголовки, только если хотите через HeaderList.Load. Это будет быстрее, чем разбор всего сообщения. Вот пример:

string filename = ...

var headerList = HeaderList.Load(filename);

var subject = headerList[HeaderId.Subject];
person Yacoub Massad    schedule 04.06.2016