Четене на повредени PST/OST файлове
Обработване на повредени файлове за съхранение
Понякога може да не е възможно четенето на PST/OST файл поради различни проблеми. Например, някои блокове от данни могат да са повредени. В такива случаи обикновено се появяват изключения при извикване на EnumerateFolders, EnumerateMessages, GetContents, GetSubfolders, и т.н. методи. Но отделни съобщения или папки може да останат недокоснати в хранилището.
Методи за намиране на идентификаторите на елементите
Следните методи позволяват да се намерят идентификатори на елементи по йерархичен начин.
- FindMessages(string parentEntryId) - намира идентификаторите на съобщенията за папката.
- FindSubfolders(string parentEntryId) - намира идентификаторите на подпапките за папката.
Идентификаторите, получени чрез методите, могат да се използват за извличане на съобщения и папки.
NOTE: Трябва да се отбележи, че въпреки предимствата му, съществуват повредени хранилища, които не могат да се прочетат дори с помощта на тези методи.
Претърсване на PST файлове
Следният примерен код показва претърсване на PST файл и извличане на папки и съобщения. За получаване на списъка с идентификатори използвайте методите FindMessages и FindSubfolders. След това идентификаторът се предава към ExtractMessage или GetFolderById метод за извличане на елементи.
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);
}
ExploreCorruptedPst(pst, subFolderId);
}
}
}