Четене на повредени 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 елементи от повредени файлове
API за обхождане позволява извличане на всички PST елементи доколкото е възможно, без да се хвърлят изключения, дори ако част от данните в оригиналния файл са повредени.
Използвайте PersonalStorage(TraversalExceptionsCallback callback) конструктор и load(String fileName) метод вместо fromFile метод.
Конструкторът позволява дефиниране на метод за обратен извикване.
TraversalExceptionsCallback exceptionsCallback = new TraversalExceptionsCallback() {
@Override
public void invoke(TraversalAsposeException exception, String itemId) {
/* Exception handling code. */
}
};
try (PersonalStorage pst = new PersonalStorage(exceptionsCallback)) { }
Изключения при зареждане и обхождане ще бъдат достъпни чрез метода за обратен извикване.
Методът 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);
}
}