Beschädigte PST/OST-Dateien lesen
Beschädigte PST/OST-Dateien lesen
Manchmal kann es nicht möglich sein, die PST/OST zu lesen wegen bestimmter Probleme. 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.
Aspose.Email‑Benutzer können Element‑Bezeichner hierarchisch finden. Darüber hinaus können Sie Elemente anhand von Bezeichnern extrahieren. Zu diesem Zweck stellt die Bibliothek die folgenden Methoden bereit:
- PersonalStorage.findMessages(String parentEntryId) - findet die Bezeichner der Nachrichten für den Ordner.
- PersonalStorage.findSubfolders(String parentEntryId) - findet die Bezeichner der Unterordner für den Ordner.
Hinweis, dass es trotz der Vorteile beschädigte Speicher gibt, die selbst mit diesen Methoden nicht gelesen werden können.
Der folgende Codeausschnitt demonstriert die Verwendung dieser Methoden zum Lesen beschädigter PST/OST-Dateien:
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
exploreCorruptedPst(pst, pst.getRootFolder().getEntryIdString());
}
public static void exploreCorruptedPst(PersonalStorage pst, String rootFolderId) {
Iterable<String> messageIdList = pst.findMessages(rootFolderId);
for (String messageId : messageIdList) {
try {
MapiMessage msg = pst.extractMessage(messageId);
System.out.println("- " + msg.getSubject());
} catch (Exception e) {
System.out.println("Message reading error. Entry id: " + messageId);
}
}
Iterable<String> folderIdList = pst.findSubfolders(rootFolderId);
for (String subFolderId : folderIdList) {
if (subFolderId != rootFolderId) {
try {
FolderInfo subfolder = pst.getFolderById(subFolderId);
System.out.println(subfolder.getDisplayName());
} catch (Exception e) {
System.out.println("Message reading error. Entry id: " + subFolderId);
}
exploreCorruptedPst(pst, subFolderId);
}
}
}
PST-Elemente aus beschädigten Dateien extrahieren
Die Durchlauf‑API ermöglicht das Extrahieren aller PST-Elemente, soweit möglich, ohne Ausnahmen zu werfen, selbst wenn einige Daten der Originaldatei beschädigt sind.
Verwenden Sie die PersonalStorage(TraversalExceptionsCallback callback) Konstruktor und die load(String fileName) Methode anstelle der fromFile Methode.
Der Konstruktor ermöglicht das Definieren einer Callback‑Methode.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Lade‑ und Durchlauf‑Ausnahmen stehen über die Callback‑Methode zur Verfügung.
Die load‑Methode gibt ’true’ zurück, wenn die Datei erfolgreich geladen wurde und ein weiterer Durchlauf möglich ist. Ist die Datei beschädigt und kein Durchlauf möglich, wird ‘false’ zurückgegeben.
if (currentPst.load(inputStream))
Das folgende Codebeispiel zeigt, wie die PST-Datei‑Durchlauf‑API in ein Projekt implementiert wird:
public static void main(String[] args) {
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) {
if (pst.load("test.pst")) {
getAllMessages(pst, pst.getRootFolder());
}
}
}
private static void getAllMessages(PersonalStorage pst, FolderInfo folder) {
for (String messageEntryId : folder.enumerateMessagesEntryId()) {
MapiMessage message = pst.extractMessage(messageEntryId);
}
for (FolderInfo subFolder : folder.getSubFolders()) {
getAllMessages(pst, subFolder);
}
}