Чтение повреждённых 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);
            }

            ExploreCorruptedPst(pst, subFolderId);
        }
    }
}