Odczyt uszkodzonych plików PST/OST

Obsługa uszkodzonych plików magazynu

Czasami nie jest możliwe odczytanie pliku PST/OST z powodu różnych problemów. Na przykład niektóre bloki danych mogą być uszkodzone. W takich przypadkach zwykle pojawiają się wyjątki podczas wywoływania EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, itp. metody. Jednak pojedyncze wiadomości lub foldery mogą pozostać nienaruszone w magazynie.

Metody znajdowania identyfikatorów elementów

Poniższe metody umożliwiają znajdowanie identyfikatorów elementów w sposób hierarchiczny.

Identyfikatory uzyskane przy użyciu metod mogą być użyte do pobrania wiadomości i folderów.

UWAGA: Należy zauważyć, że pomimo zalet istnieją uszkodzone magazyny, które nie mogą być odczytane nawet przy użyciu tych metod.

Przeglądanie pliku PST

Poniższy przykład kodu pokazuje przeglądanie pliku PST oraz wyodrębnianie folderów i wiadomości. Aby uzyskać listę identyfikatorów, użyj metod FindMessages i FindSubfolders. Następnie identyfikator jest przekazywany do ExtractMessage lub GetFolderById metoda do wyodrębniania elementów.

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