Corrupte PST/OST‑bestanden lezen

Corrupte PST/OST‑bestanden lezen

Soms is het niet mogelijk om de PST/OST te lezen vanwege bepaalde problemen. Bijvoorbeeld, sommige datablocks kunnen corrupt zijn. In dergelijke gevallen ontstaan er meestal uitzonderingen bij het aanroepen van de EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, enz. methoden. Maar individuele berichten of mappen kunnen onbeschadigd blijven in de opslag.

Gebruikers van Aspose.Email kunnen item‑identificatoren hiërarchisch vinden. Daarnaast kun je items extraheren op basis van identificatoren. Voor dit doel biedt de bibliotheek de volgende methoden:

Opmerking, ondanks de voordelen zijn er corrupte opslagruimtes die zelfs met deze methoden niet gelezen kunnen worden.

De volgende code‑snippet demonstreert het gebruik van deze methoden om corrupte PST/OST‑bestanden te lezen:

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‑items extraheren uit corrupte bestanden

De doorloop‑API maakt het mogelijk om alle PST‑items zoveel mogelijk te extraheren, zonder uitzonderingen te genereren, zelfs als sommige gegevens van het originele bestand corrupt zijn.

Gebruik de PersonalStorage(TraversalExceptionsCallback callback) constructor en de load(String fileName) methode in plaats van de fromFile methode.

De constructor maakt het mogelijk een callback‑methode te definiëren.

TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
    @Override
    public void invoke(TraversalAsposeException exception, String itemId) {
        /* Exception handling  code. */
    }
};

try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }

Laad‑ en doorloop‑uitzonderingen zijn beschikbaar via de callback‑methode.

De load‑methode retourneert ’true’ als het bestand succesvol is geladen en verdere doorloop mogelijk is. Als een bestand corrupt is en er geen doorloop mogelijk is, wordt ‘false’ geretourneerd.

if (currentPst.load(inputStream))

De volgende codevoorbeeld laat zien hoe je de PST‑bestand‑doorloop‑API in een project implementeert:

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