Beschädigte PST/OST-Dateien lesen
Umgang mit beschädigten Speicherdateien
Manchmal ist es nicht möglich, ein PST/OST aufgrund bestimmter Probleme zu lesen. Beispielsweise können einige Datenblöcke beschädigt sein. In solchen Fällen treten beim Aufruf der EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, usw. Methoden. Aber einzelne Nachrichten oder Ordner können im Speicher unbeschädigt bleiben.
Methoden zum Finden der Elementbezeichner
Die folgenden Methoden ermöglichen das hierarchische Auffinden von Elementbezeichnern.
- FindMessages(string parentEntryId) - findet die Bezeichner der Nachrichten für den Ordner.
- FindSubfolders(string parentEntryId) - findet die Bezeichner der Unterordner für den Ordner.
Mit den Methoden erhaltene Bezeichner können verwendet werden, um Nachrichten und Ordner abzurufen.
HINWEIS: Es sollte beachtet werden, dass es trotz der Vorteile beschädigte Speicher gibt, die selbst mit diesen Methoden nicht gelesen werden können.
Durchlaufen von PST-Dateien
Das folgende Codebeispiel zeigt das Durchlaufen von PST-Dateien sowie das Extrahieren von Ordnern und Nachrichten. Verwenden Sie die Methoden FindMessages und FindSubfolders, um die Liste der Bezeichner zu erhalten. Dann wird der Bezeichner an die ExtractMessage oder GetFolderById Methode zum Extrahieren von Elementen.
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);
}
}
}