Искупление Не удается добавить элемент в папку

Я пишу программу на C#, используя Redemption для перебора объектов RDOMail в RDOPstStore и копирования тех, которые помечены как релевантные, в новый RDOPstStore. Я могу изменить папки в RDOPstStore.IPMRootFolder и оставить только одну папку (Результаты). Однако, когда я добавляю элементы RDOMail в эту папку (сохраненные ранее в списке), элементы не отображаются в папке Items. Есть ли что-то, чего мне не хватает, чтобы обеспечить сохранение «добавленного» объекта RDOMail в объекте RDOPstStore? Вот код

//create an output session 
RDOSession outputSession = new RDOSession(@"Redemption.RDOSession");

//logon/create output store
outputStore = outputSession.LogonPstStore(outputDir + '\\' + filename);

//clear the output store of any folders, we will leave only one: Results
foreach (RDOFolder folder in outputStore.IPMRootFolder.Folders)
{
       folder.Delete(); //successful
}
RDOFolder resultsFolder = outputStore.IPMRootFolder.Folders.Add("Results");

foreach(RDOMail mail in relevantItems) //relevantItems gathered previously
{
        resultsFolder.Items.Add(mail); //unsuccessful
        resultsFolder.Save();
}

/******************EDIT 5/26****************/
outputStore.Save();
outputSession.Logoff();
/******************END EDIT*****************/

Вся помощь очень ценится!


person Freestyle076    schedule 22.05.2015    source источник


Ответы (3)


Во-первых, LogonPstStore возвращает экземпляр объекта RDOPstStore — нет причин извлекать его из коллекции Stores или добавлять во второй раз.

outputStore  = outputSession.LogonPstStore(outputDir + '\\' + filename);

Во-вторых, поставщик PST фиксирует изменения в файле PST позже или при закрытии сеанса. Ваше приложение завершается корректно? Вы вызываете RDOSession.Logoff?

person Dmitry Streblechenko    schedule 23.05.2015
comment
Спасибо за предложенный ответ! Приложение представляет собой настольное приложение, предназначенное для выполнения нескольких запусков манипуляций с pst, поэтому завершение работы приложения невозможно. Это проблема? Я отключил сеанс (см. правки), что, как я полагал, было способом фиксации изменений, но это не работает. Как я могу синхронно зафиксировать изменения в коде? - person Freestyle076; 26.05.2015
comment
Я не предлагал завершить приложение (что является плохой идеей), а скорее убедился, что ваше приложение завершается корректно. Остался ли файл tmp после завершения работы вашего приложения в той же папке, где находится файл PST? - person Dmitry Streblechenko; 26.05.2015

Подождите секунду, вы не сохраняли сообщение, которое вы добавили - вы вызвали сохранение в папке вместо элемента, возвращенного Items.Add:

RDOMail item = resultsFolder.Items.Add(mail);
item.Save();
person Dmitry Streblechenko    schedule 26.05.2015
comment
Не такой интуитивный по искуплению, но хороший улов. Спасибо за помощь! - person Freestyle076; 27.05.2015
comment
Совершенно никаких проблем! Вот как работают и Redemption, и объектная модель Outlook... - person Dmitry Streblechenko; 27.05.2015

Итак, я смог обнаружить проблему. @Dmitry Streblechenko был прав в том, что мне не нужно было добавлять новый магазин PST после входа в магазин Pst (который при необходимости создает новый файл).

НО настоящая проблема заключалась в копировании файлов во вновь созданный магазин PST. Проблема заключалась в использовании функции RDOFolder.Items.Add(RDOMail). Какой бы интуитивной ни была эта функция Add(), правильным (или, по крайней мере, эффективным) подходом является использование функции RDOMail.CopyTo(RDOMail/RDOFolder). Как так...

mail.CopyTo(resultsFolder);

Это успешно поместило объект RDOMail в объект RDOFolder, тогда как функция Add() этого не сделала. В качестве примечания я прочитал другой пост, в котором помог @Dmitry, и он упоминает, что функция Add() используется для создания новых элементов, поэтому она может быть не совсем бесполезной. Хотя кажется, что можно создать новый объект RDOMail, изменить его, а затем использовать его функцию CopyTo()...

Урок выучен.

person Freestyle076    schedule 26.05.2015