Читання пошкоджених PST/OST файлів
Читання пошкоджених PST/OST файлів
Іноді може бути неможливо прочитати PST/OST через деякі проблеми. Наприклад, деякі блоки даних можуть бути пошкоджені. У таких випадках під час виклику часто виникають виключення. EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, тощо. методи. Але окремі повідомлення або папки можуть залишатися недоторканими у сховищі.
Користувачі Aspose.Email можуть знаходити ідентифікатори елементів ієрархічно. Далі можна витягувати елементи за ідентифікаторами. Для цього бібліотека пропонує наступні методи:
- PersonalStorage.findMessages(String parentEntryId) - знаходить ідентифікатори повідомлень для папки.
- PersonalStorage.findSubfolders(String parentEntryId) - знаходить ідентифікатори підпапок для папки.
Примітка, що незважаючи на переваги, існують пошкоджені сховища, які не можна прочитати навіть за допомогою цих методів.
Наступний фрагмент коду демонструє використання цих методів для читання пошкоджених 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);
}
}
}
Витягнути елементи PST з пошкоджених файлів
API обходу дозволяє витягувати всі елементи PST наскільки це можливо, не викидаючи виключень, навіть якщо деякі дані вихідного файлу пошкоджені.
Використайте PersonalStorage(TraversalExceptionsCallback callback) конструктор та load(String fileName) метод замість fromFile метод.
Конструктор дозволяє визначити метод зворотного виклику.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Винятки під час завантаження та обходу будуть доступні через метод зворотного виклику.
Метод load повертає ’true’, якщо файл успішно завантажено і подальший обхід можливий. Якщо файл пошкоджений і обхід неможливий, повертається ‘false’.
if (currentPst.load(inputStream))
Наступний приклад коду показує, як впровадити API обходу PST файлу в проєкт:
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);
}
}