Làm việc với các tệp PST lớn
Contents
[
Hide
]
Hiệu năng có thể bị giảm khi xử lý các tệp PST lớn. Các giải pháp dưới đây sẽ giúp bạn cải thiện hiệu năng của ứng dụng khi xử lý các tệp lưu trữ lớn.
Xem xét các phương thức trả về
IEnumerable khi duyệt qua các thư mục hoặc tin nhắn trong 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
}
Ưu tiên MessageInfo để truy cập các thuộc tính cơ bản của tin nhắn.
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}");
}
Tránh sử dụng ExtractMessage hoặc EnumerateMapiMessages các phương thức cho tất cả tin nhắn trừ khi bạn cần truy cập tất cả các thuộc tính.
Xem xét việc sử dụng EnumerateMessagesEntryId để dễ dàng truy xuất tất cả ID tin nhắn trong một thư mục.
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).
}
Xem xét việc sử dụng ExtractProperty để đọc một thuộc tính đơn lẻ còn thiếu trong MessageInfo.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var transportMessageHeaders =
pst.ExtractProperty(Convert.FromBase64String(msgId), KnownPropertyList.TransportMessageHeaders.Tag)
.GetString();
}
Xem xét việc sử dụng ExtractAttachments nếu chỉ cần các tệp đính kèm.
foreach (var msgId in folder.EnumerateMessagesEntryId())
{
var attachments = pst.ExtractAttachments(msgId);
}
Sử dụng Tìm kiếm theo tiêu chílọc dựa trên - để lấy các tin nhắn bạn cần.
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());
}
Xem xét việc sử dụng SaveMessageToStream nếu cần lưu các tin nhắn từ pst.
Thay vì sử dụng:
foreach (var id in folder.EnumerateMessagesEntryId())
{
var msg = pst.ExtractMessage(id);
msg.Save(@"message.msg");
}
Sử dụng:
foreach (var id in folder.EnumerateMessagesEntryId())
{
pst.SaveMessageToStream(id, File.OpenWrite(@"message.msg"));
}