Leer archivos PST/OST corruptos
Leer archivos PST/OST corruptos
A veces puede no ser posible leer el PST/OST debido a ciertos problemas. Por ejemplo, algunos bloques de datos pueden estar corruptos. En tales casos, normalmente se generan excepciones al invocar el EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. métodos. Pero algunos mensajes o carpetas pueden permanecer sin daño en el almacén.
Los usuarios de Aspose.Email pueden encontrar identificadores de elementos de forma jerárquica. Además, pueden extraer elementos mediante sus identificadores. Con este fin, la biblioteca ofrece los siguientes métodos:
- PersonalStorage.findMessages(String parentEntryId) - encuentra los identificadores de mensajes para la carpeta.
- PersonalStorage.findSubfolders(String parentEntryId) - encuentra los identificadores de subcarpetas para la carpeta.
Nota, que a pesar de las ventajas, existen almacenes corruptos que no pueden leerse incluso usando estos métodos.
El siguiente fragmento de código demuestra el uso de estos métodos para leer archivos PST/OST corruptos:
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);
}
}
}
Extraer elementos PST de archivos corruptos
La API de recorrido permite extraer todos los elementos del PST tanto como sea posible, sin lanzar excepciones, incluso si algunos datos del archivo original están corruptos.
Utilice el PersonalStorage(TraversalExceptionsCallback callback) constructor y el load(String fileName) método en lugar del fromFile método.
El constructor permite definir un método de devolución de llamada.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Las excepciones de carga y recorrido estarán disponibles a través del método de devolución de llamada.
El método load devuelve ’true’ si el archivo se ha cargado correctamente y es posible continuar el recorrido. Si el archivo está corrupto y no se puede recorrer, se devuelve ‘false’.
if (currentPst.load(inputStream))
El siguiente ejemplo de código muestra cómo implementar la API de recorrido de archivos PST en un proyecto:
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);
}
}