Читання пошкоджених PST/OST файлів
Обробка пошкоджених файлів сховища
Іноді може бути неможливо прочитати PST/OST через певні проблеми. Наприклад, деякі блоки даних можуть бути пошкоджені. У таких випадках під час виклику методу зазвичай виникають виключення EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, тощо. методи. Але окремі повідомлення або папки можуть залишатися недоторканими у сховищі.
Методи пошуку ідентифікаторів елементів
Наступні методи дозволяють знаходити ідентифікатори елементів ієрархічно.
- FindMessages(string parentEntryId) - знаходить ідентифікатори повідомлень для папки.
- FindSubfolders(string parentEntryId) - знаходить ідентифікатори підпапок для папки.
Ідентифікатори, отримані за допомогою цих методів, можна використати для отримання повідомлень та папок.
ПРИМІТКА: Слід зазначити, що незважаючи на переваги, існують пошкоджені сховища, які не можна прочитати навіть за допомогою цих методів.
Обхід PST‑файлу
Наступний приклад коду показує обход PST‑файлу та вилучення папок і повідомлень. Щоб отримати список ідентифікаторів, використовуйте методи FindMessages та FindSubfolders. Потім ідентифікатор передається до ExtractMessage або GetFolderById метод для вилучення елементів.
using (var pst = PersonalStorage.FromFile(fileName))
{
ExploreCorruptedPst(pst, pst.RootFolder.EntryIdString);
}
public static void ExploreCorruptedPst(PersonalStorage pst, string rootFolderId)
{
var messageIdList = pst.FindMessages(rootFolderId);
foreach (var messageId in messageIdList)
{
try
{
var msg = pst.ExtractMessage(messageId);
Console.WriteLine( "- " + msg.Subject);
}
catch
{
Console.WriteLine("Message reading error. Entry id: " + messageId);
}
}
var folderIdList = pst.FindSubfolders(rootFolderId);
foreach (var subFolderId in folderIdList)
{
if (subFolderId != rootFolderId)
{
try
{
FolderInfo subfolder = pst.GetFolderById(subFolderId);
Console.WriteLine(subfolder.DisplayName);
}
catch
{
Console.WriteLine("Message reading error. Entry id: " + subFolderId);
}
ExplodeCorruptedPst(pst, subFolderId);
}
}
}