Чтение поврежденных файлов PST/OST

Чтение поврежденных файлов PST/OST

Иногда из-за некоторых проблем чтение PST/OST может оказаться невозможным. Например, некоторые блоки данных могут быть повреждены. В таких случаях обычно возникают исключения при вызове EnumerateFolders, EnumerateMessages, GetContents, GetSubfoldersи т. д. методы. Но отдельные сообщения или папки могут остаться неповрежденными в хранилище.

Пользователи Aspose.Email могут найти идентификаторы товаров в иерархическом порядке. Кроме того, вы можете извлекать элементы по идентификаторам. Для этого библиотека предлагает следующие методы:

Note, что, несмотря на преимущества, существуют поврежденные хранилища, которые невозможно прочитать даже с помощью этих методов.

Следующий фрагмент кода демонстрирует использование этих методов для чтения поврежденных файлов 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, насколько это возможно, без исключений, даже если некоторые данные исходного файла повреждены.

Используйте Персональное хранилище (обратный звонок по обходу исключений) конструктор и load (строковое имя файла) метод вместо fromFile method.

Конструктор позволяет определить метод обратного вызова.

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);
    }
}