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:

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