Leer archivos PST/OST corruptos

A veces puede que no sea posible leer el PST/OST debido a algunos problemas. Por ejemplo, algunos bloques de datos pueden estar dañados. En tales casos, suelen surgir excepciones al llamar al EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. métodos. Sin embargo, es posible que los mensajes o carpetas individuales permanezcan intactos en el almacenamiento.

Métodos para encontrar los identificadores de los artículos

Los siguientes métodos permiten encontrar los identificadores de los artículos de forma jerárquica.

Los identificadores obtenidos mediante los métodos se pueden utilizar para recuperar mensajes y carpetas.

NOTE: Cabe señalar que, a pesar de sus ventajas, existen almacenamientos corruptos que no se pueden leer ni siquiera con estos métodos.

Recorrido de archivos PST

El siguiente ejemplo de código muestra cómo un archivo PST recorre y extrae carpetas y mensajes. Para obtener la lista de identificadores, utilice los métodos FindMessages y FindSubFolders. Luego, el identificador se pasa al ExtractMessage or GetFolderById método para extraer elementos.

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