Четене на повредени PST/OST файлове

Обработване на повредени файлове за съхранение

Понякога може да не е възможно четенето на PST/OST файл поради различни проблеми. Например, някои блокове от данни могат да са повредени. В такива случаи обикновено се появяват изключения при извикване на EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, и т.н. методи. Но отделни съобщения или папки може да останат недокоснати в хранилището.

Методи за намиране на идентификаторите на елементите

Следните методи позволяват да се намерят идентификатори на елементи по йерархичен начин.

Идентификаторите, получени чрез методите, могат да се използват за извличане на съобщения и папки.

NOTE: Трябва да се отбележи, че въпреки предимствата му, съществуват повредени хранилища, които не могат да се прочетат дори с помощта на тези методи.

Претърсване на 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);
        }
    }
}