خواندن فایل‌های PST/OST خراب

خواندن فایل‌های PST/OST خراب

گاهی ممکن است به دلیل برخی مشکلات نتوان PST/OST را خواند. به عنوان مثال، برخی بلوک‌های داده ممکن است خراب باشند. در چنین مواردی، معمولاً هنگام فراخوانی متد استثناهایی رخ می‌دهد. EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders، و غیره. اما برخی پیام‌ها یا پوشه‌ها ممکن است در ذخیره‌سازی سالم باقی بمانند.

کاربران Aspose.Email می توانند شناسه‌های آیتم‌ها را به صورت سلسله مراتبی پیدا کنند. علاوه بر این، می‌توانید آیتم‌ها را با استفاده از شناسه‌ها استخراج کنید. برای این منظور، کتابخانه متدهای زیر را ارائه می‌دهد:

توجه، با وجود مزایا، برخی ذخیره‌سازی‌های خراب وجود دارند که حتی با استفاده از این متدها نیز قابل خواندن نیستند.

قطعه کد زیر نحوه استفاده از این متدها برای خواندن فایل‌های 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 تا جایی که ممکن است استخراج شوند، بدون پرتاب استثناها، حتی اگر برخی داده‌های فایل اصلی خراب باشند.

از PersonalStorage(TraversalExceptionsCallback callback) سازنده و load(String fileName) متد به جای fromFile متد.

سازنده امکان تعریف یک متد callback را می‌دهد.

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

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

استثناهای بارگذاری و مرور از طریق متد callback در دسترس خواهند بود.

متد 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);
    }
}