Odczyt uszkodzonych plików PST/OST
Odczyt uszkodzonych plików PST/OST
Czasami może nie być możliwe odczytanie pliku PST/OST z powodu pewnych problemów. Na przykład niektóre bloki danych mogą być uszkodzone. W takich przypadkach wyjątki zazwyczaj pojawiają się podczas wywoływania EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, itp. metody. Jednak pojedyncze wiadomości lub foldery mogą pozostać nienaruszone w magazynie.
Użytkownicy Aspose.Email mogą znajdować identyfikatory elementów w sposób hierarchiczny. Dodatkowo, można wyodrębniać elementy po identyfikatorach. W tym celu biblioteka oferuje następujące metody:
- PersonalStorage.findMessages(String parentEntryId) - znajduje identyfikatory wiadomości dla folderu.
- PersonalStorage.findSubfolders(String parentEntryId) - znajduje identyfikatory podfolderów dla folderu.
Uwaga, że pomimo zalet, istnieją uszkodzone magazyny, które nie mogą być odczytane nawet przy użyciu tych metod.
Poniższy fragment kodu demonstruje użycie tych metod do odczytu uszkodzonych plików PST/OST:
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);
}
}
}
Wyodrębnianie elementów PST z uszkodzonych plików
API przeglądania pozwala na wyodrębnienie wszystkich możliwych elementów PST, bez rzucania wyjątków, nawet jeśli niektóre dane oryginalnego pliku są uszkodzone.
Użyj PersonalStorage(TraversalExceptionsCallback callback) konstruktora i load(String fileName) metodę zamiast fromFile metoda.
Konstruktor umożliwia zdefiniowanie metody zwrotnej.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Wyjątki podczas ładowania i przeglądania będą dostępne poprzez metodę zwrotną.
Metoda load zwraca ’true’, jeśli plik został pomyślnie załadowany i dalsze przeglądanie jest możliwe. Jeśli plik jest uszkodzony i przeglądanie nie jest możliwe, zwracane jest ‘false’.
if (currentPst.load(inputStream))
Poniższy przykład kodu pokazuje, jak zaimplementować API przeglądania pliku PST w projekcie:
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);
}
}