Работа с големи 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())
{
// Do something with message
}
Предпочитайте MessageInfo за достъп до базови свойства на съобщенията.
foreach (var messageInfo in folder.EnumerateMessages())
{
Console.WriteLine($"Subject: {messageInfo.Subject}");
Console.WriteLine($"To: {messageInfo.DisplayTo}");
Console.WriteLine($"Importance: {messageInfo.Importance}");
Console.WriteLine($"Message Class: {messageInfo.MessageClass}");
}
Избягвайте използването на ExtractMessage или EnumerateMapiMessages методи за всички съобщения, освен ако не се нуждаете от достъп до всички свойства.
Обмислете използването на EnumerateMessagesEntryId за лесно извличане на всички ID на съобщения, съдържащи се в папка.
foreach (var id in folder.EnumerateMessagesEntryId())
{
// Use id to retrieve a property (ExtractProperty),
// extract a MapiMessage (ExtractMessage),
// extarct message attachments (ExtractAttachments),
// save msg to a stream(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();
// Unread messages
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"));
}