Läs korrupta PST/OST-filer

Läs korrupta PST/OST-filer

Ibland kan det vara omöjligt att läsa PST/OST på grund av vissa problem. Till exempel kan vissa datablock vara korrupta. I sådana fall uppstår vanligtvis undantag när man anropar EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, osv. metoder. Men enskilda meddelanden eller mappar kan förbli oskadade i lagringen.

Aspose.Email‑användare kan hitta objektidentifierare på ett hierarkiskt sätt. Dessutom kan du extrahera objekt med identifierare. För detta ändamål erbjuder biblioteket följande metoder:

Obs, att trots fördelarna finns det korrupta lagringar som inte kan läsas även med dessa metoder.

Följande kodsnutt demonstrerar användningen av dessa metoder för att läsa korrupta PST/OST-filer:

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

Extrahera PST-objekt från korrupta filer

Traverserings‑API:et tillåter att extrahera alla PST‑objekt så långt som möjligt utan att kasta undantag, även om vissa data i originalfilen är korrupta.

Använd PersonalStorage(TraversalExceptionsCallback callback) konstruktor och load(String fileName) metod istället för fromFile metod.

Konstruktorn tillåter att definiera en återuppringningsmetod.

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

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

Laddnings- och traverseringsundantag kommer att vara tillgängliga via återuppringningsmetoden.

Load‑metoden returnerar ’true’ om filen har lästs in korrekt och vidare traversering är möjlig. Om en fil är korrupt och ingen traversering är möjlig, returneras ‘false’.

if (currentPst.load(inputStream))

Följande kodexempel visar hur man implementerar PST-filtraverserings‑API i ett projekt:

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