Čtení poškozených souborů PST/OST
Číst poškozené soubory PST/OST
Někdy může být čtení PST/OST nemožné kvůli určitým problémům. Například některé datové bloky mohou být poškozené. V takových případech se obvykle při volání EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, atd. metody. Ale jednotlivé zprávy či složky mohou zůstat v úložišti nepoškozené.
Uživatelé Aspose.Email mohou najít identifikátory položek hierarchicky. Dále můžete extrahovat položky podle identifikátorů. K tomuto účelu knihovna nabízí následující metody:
- PersonalStorage.findMessages(String parentEntryId) - najde identifikátory zpráv pro složku.
- PersonalStorage.findSubfolders(String parentEntryId) - najde identifikátory podsložek pro složku.
Poznámka, že navzdory výhodám existují poškozená úložiště, která nelze přečíst ani při použití těchto metod.
Následující úryvek kódu demonstruje použití těchto metod pro čtení poškozených souborů 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);
}
}
}
Extrahovat položky PST z poškozených souborů
API pro procházení umožňuje extrahovat všechny položky PST, jak jen to je možné, aniž by vyhazovalo výjimky, i když jsou některá data původního souboru poškozená.
Použijte PersonalStorage(TraversalExceptionsCallback callback) konstruktor a load(String fileName) metoda místo fromFile metoda.
Konstruktor umožňuje definovat metodu zpětného volání.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Výjimky při načítání a procházení budou k dispozici prostřednictvím zpětného volání.
Metoda load vrací ’true’, pokud byl soubor úspěšně načten a další procházení je možné. Pokud je soubor poškozen a procházení není možné, vrátí se ‘false’.
if (currentPst.load(inputStream))
Následující ukázka kódu ukazuje, jak implementovat API pro procházení souboru PST do projektu:
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);
}
}