读取损坏的 PST/OST 文件

处理损坏的存储文件

有时由于某些问题可能无法读取 PST/OST。例如,某些数据块可能已损坏。在这种情况下,调用时通常会抛出异常 EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders,等方法。但存储中的单个邮件或文件夹可能仍保持完好。

查找项目标识符的方法

以下方法可以分层查找项目标识符。

使用这些方法获得的标识符可用于检索邮件和文件夹。

注意: 需要指出的是,尽管有这些优势,仍有损坏的存储即使使用这些方法也无法读取。

PST 文件遍历

以下代码示例展示了 PST 文件遍历以及提取文件夹和邮件。要获取标识符列表,请使用 FindMessages 和 FindSubfolders 方法。然后将标识符传递给 ExtractMessageGetFolderById 用于提取元素的方法。

using (var pst = PersonalStorage.FromFile(fileName))
{
    ExploreCorruptedPst(pst, pst.RootFolder.EntryIdString);
}

public static void ExploreCorruptedPst(PersonalStorage pst, string rootFolderId)
{
    var messageIdList = pst.FindMessages(rootFolderId);

    foreach (var messageId in messageIdList)
    {
        try
        {
            var msg = pst.ExtractMessage(messageId);
            Console.WriteLine( "- " + msg.Subject);
        }
        catch
        {
            Console.WriteLine("Message reading error. Entry id: " + messageId);
        }
    }

    var folderIdList = pst.FindSubfolders(rootFolderId);

    foreach (var subFolderId in folderIdList)
    {
        if (subFolderId != rootFolderId)
        {
            try
            {
                FolderInfo subfolder = pst.GetFolderById(subFolderId);
                Console.WriteLine(subfolder.DisplayName);
            }
            catch
            {
                Console.WriteLine("Message reading error. Entry id: " + subFolderId);
            }

            ExplodeCorruptedPst(pst, subFolderId);
        }
    }
}