Читання пошкоджених PST/OST файлів

Обробка пошкоджених файлів сховища

Іноді може бути неможливо прочитати PST/OST через певні проблеми. Наприклад, деякі блоки даних можуть бути пошкоджені. У таких випадках під час виклику методу зазвичай виникають виключення EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, тощо. методи. Але окремі повідомлення або папки можуть залишатися недоторканими у сховищі.

Методи пошуку ідентифікаторів елементів

Наступні методи дозволяють знаходити ідентифікатори елементів ієрархічно.

Ідентифікатори, отримані за допомогою цих методів, можна використати для отримання повідомлень та папок.

ПРИМІТКА: Слід зазначити, що незважаючи на переваги, існують пошкоджені сховища, які не можна прочитати навіть за допомогою цих методів.

Обхід 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);
        }
    }
}