破損した 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))
以下のコードサンプルは、プロジェクトに PST ファイルトラバーサル API を実装する方法を示しています:
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);
}
}