Чтение поврежденных 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("Ошибка чтения сообщения. Идентификатор записи: " + 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("Ошибка чтения сообщения. Идентификатор записи: " + 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) {
/* Код обработки исключений. */
}
};
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) {
/* Код обработки исключений. */
}
};
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);
}
}