Trabajar con archivos PST grandes
Contents
[
Hide
]
El rendimiento puede verse degradado al procesar archivos PST grandes. Las siguientes sugerencias te ayudarán a mejorar el rendimiento de tu aplicación al procesar archivos grandes.
Considera métodos que devuelvan
IEnumerable
al recorrer carpetas o mensajes en un pst.
using var pst = PersonalStorage.FromFile(@"storage.pst");
foreach (var folder in pst.RootFolder.EnumerateFolders())
foreach (var messageInfo in folder.EnumerateMessages())
{
// Haz algo con el mensaje
}
Prefiere MessageInfo para acceder a las propiedades básicas del mensaje.
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Asunto: {messageInfo.Subject}");
Console.WriteLine($"Para: {messageInfo.DisplayTo}");
Console.WriteLine($"Importancia: {messageInfo.Importance}");
Console.WriteLine($"Clase de Mensaje: {messageInfo.MessageClass}");
}
Evita usar los métodos ExtractMessage o EnumerateMapiMessages para todos los mensajes a menos que necesites acceder a todas las propiedades.
Considera usar EnumerateMessagesEntryId para recuperar fácilmente todos los IDs de los mensajes contenidos en una carpeta.
foreach (var id in folder.EnumerateMessagesEntryId())
{
// Usa id para recuperar una propiedad (ExtractProperty),
// extraer un MapiMessage (ExtractMessage),
// extraer los adjuntos del mensaje (ExtractAttachments),
// guardar mensaje en un stream(SaveMessageToStream).
}
Considera usar ExtractProperty para leer una sola propiedad que falta en MessageInfo.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var transportMessageHeaders =
pst.ExtractProperty(Convert.FromBase64String(msgId), KnownPropertyList.TransportMessageHeaders.Tag)
.GetString();
}
Considera usar ExtractAttachments si solo se requieren los adjuntos.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var attachments = pst.ExtractAttachments(msgId);
}
Usa el filtrado basado en criterios de búsqueda para obtener los mensajes que requieres.
using var pst = PersonalStorage.FromFile(@"storage.pst");
var builder = new PersonalStorageQueryBuilder();
// Mensajes no leídos
builder.HasNoFlags(MapiMessageFlags.MSGFLAG_READ);
foreach (var folder in pst.RootFolder.EnumerateFolders())
{
var unread = folder.GetContents(builder.GetQuery());
}
Considera usar SaveMessageToStream si es necesario guardar mensajes del pst.
En lugar de usar:
foreach (var id in folder.EnumerateMessagesEntryId())
{
var msg = pst.ExtractMessage(id);
msg.Save(@"message.msg");
}
Usa:
foreach (var id in folder.EnumerateMessagesEntryId())
{
pst.SaveMessageToStream(id, File.OpenWrite(@"message.msg"));
}