קריאת קבצי PST/OST פגומים
קריאת קבצי PST/OST פגומים
לעיתים לא ניתן לקרוא את ה‑PST/OST עקב בעיות מסוימות. לדוגמה, ייתכן שחלק מחסמי הנתונים פגומים. במקרים כאלה, בדרך כלל מתרחשות חריגות בעת קריאה ל‑ EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, וכו׳. עם זאת, הודעות או תיקיות בודדות עשויות להישאר שלמות באחסון.
משתמשי Aspose.Email יכולים למצוא מזהי פריטים בצורה היררכית. בנוסף, ניתן לחלץ פריטים לפי מזהים. לשם כך, הספרייה מציעה את השיטות הבאות:
- PersonalStorage.findMessages(String parentEntryId) - מוצא את המזהים של הודעות עבור התיקייה.
- PersonalStorage.findSubfolders(String parentEntryId) - מוצא את המזהים של תת‑תיקיות עבור התיקייה.
הערה, שלמרות היתרונות, קיימים אחסונים פגומים שלא ניתן לקרוא גם באמצעות שיטות אלה.
קטע הקוד הבא מציג את השימוש בשיטות אלו לקריאת קבצי 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 שיטה.
הקונסטרוקטור מאפשר להגדיר שיטת קולבק.
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);
}
}