Lire les fichiers PST/OST corrompus
Lire les fichiers PST/OST corrompus
Il se peut parfois qu’il ne soit pas possible de lire le PST/OST en raison de certains problèmes. Par exemple, certains blocs de données peuvent être corrompus. Dans de tels cas, des exceptions surviennent généralement lors de l’appel du EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, etc. méthodes. Mais des messages ou dossiers individuels peuvent rester intacts dans le stockage.
Les utilisateurs d’Aspose.Email peuvent trouver les identifiants des éléments de manière hiérarchique. De plus, vous pouvez extraire les éléments par leurs identifiants. À cette fin, la bibliothèque propose les méthodes suivantes :
- PersonalStorage.findMessages(String parentEntryId) - trouve les identifiants des messages pour le dossier.
- PersonalStorage.findSubfolders(String parentEntryId) - trouve les identifiants des sous‑dossiers pour le dossier.
Note, malgré les avantages, il existe des stockages corrompus qui ne peuvent pas être lus même avec ces méthodes.
Le fragment de code suivant démontre l’utilisation de ces méthodes pour lire des fichiers PST/OST corrompus :
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);
}
}
}
Extraire les éléments PST des fichiers corrompus
L’API de traversée permet d’extraire autant d’éléments PST que possible, sans générer d’exceptions, même si certaines données du fichier original sont corrompues.
Utilisez le PersonalStorage(TraversalExceptionsCallback callback) constructeur et le load(String fileName) méthode à la place de la fromFile méthode.
Le constructeur permet de définir une méthode de rappel.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Les exceptions de chargement et de parcours seront disponibles via la méthode de rappel.
La méthode load renvoie ’true’ si le fichier a été chargé avec succès et que la traversée ultérieure est possible. Si le fichier est corrompu et qu’aucune traversée n’est possible, elle renvoie ‘false’.
if (currentPst.load(inputStream))
L’exemple de code suivant montre comment implémenter l’API de traversée de fichiers PST dans un projet :
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);
}
}