Работа с большими PST файлами
Contents
[
Hide
]
Производительность может ухудшаться при обработке больших PST файлов. Следующие рекомендации помогут вам улучшить производительность вашего приложения при обработке больших файлов.
Рассмотрите методы, возвращающие
IEnumerable
, при обходе папок или сообщений в PST.
using var pst = PersonalStorage.FromFile(@"storage.pst");
foreach (var folder in pst.RootFolder.EnumerateFolders())
foreach (var messageInfo in folder.EnumerateMessages())
{
// Выполните какое-либо действие с сообщением
}
Предпочитайте MessageInfo для доступа к основным свойствам сообщения.
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Тема: {messageInfo.Subject}");
Console.WriteLine($"Кому: {messageInfo.DisplayTo}");
Console.WriteLine($"Важность: {messageInfo.Importance}");
Console.WriteLine($"Класс сообщения: {messageInfo.MessageClass}");
}
Избегайте использования методов ExtractMessage или EnumerateMapiMessages для всех сообщений, если вам не нужен доступ ко всем свойствам.
Рассмотрите возможность использования EnumerateMessagesEntryId для легкого извлечения всех идентификаторов сообщений, содержащихся в папке.
foreach (var id in folder.EnumerateMessagesEntryId())
{
// Используйте id, чтобы получить свойство (ExtractProperty),
// извлечь MapiMessage (ExtractMessage),
// извлечь вложения сообщения (ExtractAttachments),
// сохранить сообщение в поток (SaveMessageToStream).
}
Рассмотрите возможность использования ExtractProperty для чтения отдельного свойства, отсутствующего в MessageInfo.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var transportMessageHeaders =
pst.ExtractProperty(Convert.FromBase64String(msgId), KnownPropertyList.TransportMessageHeaders.Tag)
.GetString();
}
Рассмотрите возможность использования ExtractAttachments, если нужны только вложения.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var attachments = pst.ExtractAttachments(msgId);
}
Используйте фильтрацию на основе критериев поиска для получения нужных сообщений.
using var pst = PersonalStorage.FromFile(@"storage.pst");
var builder = new PersonalStorageQueryBuilder();
// Непрочитанные сообщения
builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
foreach (var folder in pst.RootFolder.EnumerateFolders())
{
var unread = folder.GetContents(builder.GetQuery());
}
Рассмотрите возможность использования SaveMessageToStream, если необходимо сохранить сообщения из PST.
Вместо использования:
foreach (var id in folder.EnumerateMessagesEntryId())
{
var msg = pst.ExtractMessage(id);
msg.Save(@"message.msg");
}
Используйте:
foreach (var id in folder.EnumerateMessagesEntryId())
{
pst.SaveMessageToStream(id, File.OpenWrite(@"message.msg"));
}
Предпочитайте массовые методы для добавления или удаления нескольких элементов.