Lire les fichiers PST/OST corrompus
Gestion des fichiers de stockage corrompus
Il peut parfois être impossible de lire un PST/OST en raison de certains problèmes. Par exemple, certains blocs de données peuvent être corrompus. Dans de tels cas, des exceptions surviennent généralement lors de l’appel de la EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. méthodes. Mais des messages ou dossiers individuels peuvent rester intacts dans le stockage.
Méthodes pour trouver les identifiants d’éléments
Les méthodes suivantes permettent de trouver les identifiants d’éléments de manière hiérarchique.
- FindMessages(string parentEntryId) - trouve les identifiants des messages pour le dossier.
- FindSubfolders(string parentEntryId) - trouve les identifiants des sous‑dossiers pour le dossier.
Les identifiants obtenus à l’aide des méthodes peuvent être utilisés pour récupérer les messages et les dossiers.
NOTE : Il convient de noter que malgré ses avantages, il existe des stockages corrompus qui ne peuvent pas être lus même en utilisant ces méthodes.
Parcours de fichiers PST
L’exemple de code suivant montre le parcours d’un fichier PST et l’extraction des dossiers et des messages. Pour obtenir la liste des identifiants, utilisez les méthodes FindMessages et FindSubfolders. Ensuite, l’identifiant est passé à la ExtractMessage ou GetFolderById méthode pour extraire des éléments.
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);
}
}
}