Ler arquivos PST/OST corrompidos
Às vezes, pode não ser possível ler o PST/OST devido a alguns problemas. Por exemplo, alguns blocos de dados podem estar corrompidos. Nesses casos, exceções geralmente surgem ao chamar os métodos EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. Porém, mensagens ou pastas individuais podem permanecer intactas no armazenamento.
Métodos para encontrar os identificadores de itens
Os seguintes métodos permitem encontrar identificadores de itens de maneira hierárquica.
- FindMessages(string parentEntryId) - encontra os identificadores de mensagens para a pasta.
- FindSubfolders(string parentEntryId) - encontra os identificadores de subpastas para a pasta.
Os identificadores obtidos usando os métodos podem ser usados para recuperar mensagens e pastas.
NOTA: Deve-se notar que, apesar de suas vantagens, existem armazéns corrompidos que não podem ser lidos mesmo usando esses métodos.
Navegação em arquivos PST
O seguinte exemplo de código mostra a navegação em um arquivo PST e a extração de pastas e mensagens. Para obter a lista de identificadores, use os métodos FindMessages e FindSubfolders. Em seguida, o identificador é passado para o método ExtractMessage ou GetFolderById para extrair 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("Erro ao ler a mensagem. ID de entrada: " + 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("Erro ao ler a mensagem. ID de entrada: " + subFolderId);
}
ExplodeCorruptedPst(pst, subFolderId);
}
}
}