Leggi file PST/OST corrotti
Gestione dei file di archiviazione corrotti
A volte potrebbe non essere possibile leggere un PST/OST a causa di alcuni problemi. Ad esempio, alcuni blocchi di dati potrebbero essere corrotti. In tali casi, sollevano eccezioni quando si chiama il EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, ecc. metodi. Ma singoli messaggi o cartelle potrebbero rimanere intatti nello storage.
Metodi per trovare gli identificatori degli elementi
I seguenti metodi consentono di trovare gli identificatori degli elementi in modo gerarchico.
- FindMessages(string parentEntryId) - trova gli identificatori dei messaggi per la cartella.
- FindSubfolders(string parentEntryId) - trova gli identificatori delle sottocartelle per la cartella.
Gli identificatori ottenuti con questi metodi possono essere usati per recuperare messaggi e cartelle.
NOTE: Va notato che, nonostante i suoi vantaggi, esistono archivi corrotti che non possono essere letti nemmeno utilizzando questi metodi.
Attraversamento file PST
Il seguente esempio di codice mostra l’attraversamento del file PST e l’estrazione di cartelle e messaggi. Per ottenere l’elenco di identificatori utilizza i metodi FindMessages e FindSubfolders. Poi l’identificatore viene passato a ExtractMessage oppure GetFolderById metodo per estrarre elementi.
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);
}
}
}