อ่านไฟล์ 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 จากไฟล์ที่เสียหาย
Traversal 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);
}
}