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:
- PersonalStorage.findMessages(String parentEntryId) - hittar identifierarna för meddelanden för mappen.
- PersonalStorage.findSubfolders(String parentEntryId) - hittar identifierarna för undermappar för mappen.
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);
}
}