Beschädigte PST/OST-Dateien lesen

Umgang mit beschädigten Speicherdateien

Manchmal ist es nicht möglich, ein PST/OST aufgrund bestimmter Probleme zu lesen. Beispielsweise können einige Datenblöcke beschädigt sein. In solchen Fällen treten beim Aufruf der EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, usw. Methoden. Aber einzelne Nachrichten oder Ordner können im Speicher unbeschädigt bleiben.

Methoden zum Finden der Elementbezeichner

Die folgenden Methoden ermöglichen das hierarchische Auffinden von Elementbezeichnern.

Mit den Methoden erhaltene Bezeichner können verwendet werden, um Nachrichten und Ordner abzurufen.

HINWEIS: Es sollte beachtet werden, dass es trotz der Vorteile beschädigte Speicher gibt, die selbst mit diesen Methoden nicht gelesen werden können.

Durchlaufen von PST-Dateien

Das folgende Codebeispiel zeigt das Durchlaufen von PST-Dateien sowie das Extrahieren von Ordnern und Nachrichten. Verwenden Sie die Methoden FindMessages und FindSubfolders, um die Liste der Bezeichner zu erhalten. Dann wird der Bezeichner an die ExtractMessage oder GetFolderById Methode zum Extrahieren von Elementen.

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);
        }
    }
}