1

我用 C# 构建了一个应用程序,它将文档从源 NSF 复制到目标 NSF。目标 NSF 是一个空壳,保留了基于源 NSF 的所有设计元素。我使用的是 Lotus Notes 8.5.3,但没有连接到 Domino 服务器。

我使用此应用程序将源 NSF 拆分为更小的块。目标是创建可以由我们的自动化(电子发现)系统有效处理的目标 NSF。我需要确保保留尽可能多的元数据。

我现有的代码满足了这些目标,除了 (1) 我丢失了文件夹信息。复制文档后,所有文件夹都是空的。(2) 所有文档都标记为已读,即使它们在源中未读。

代码 C#

//Establish session
NotesSession ns = new Domino.NotesSessionClass();
ns.Initialize("");

//Open source NSF
NotesDatabase nd = ns.GetDatabase("", "test.nsf", false);
//Open destination NSF.
//Assume that all design elements of nd2 are identical to those of nd
NotesDatabase nd2 = ns.GetDatabase("", "test2.nsf", false);

//Create view that returns all documents.
NotesView nView2 = nd.GetView("$All");
nd.CreateView("All-DR", "SELECT @ALL", nView2, false);
NotesView nView = NotesConnectionDatabase.GetView("All-DR");

//Loop through entries in the new view
NotesViewEntry nvec = nView.AllEntries;
nve = nvec.GetFirstEntry();

for (int j = 1; j <= intEntryCount; j++)
{
     if (j == 1)
     {
          nve = nvec.GetFirstEntry();
     }
     else
     {
          nve = nvec.GetNextEntry(nve);
     }

     //Copy document to second database.
     NotesDocument ndoc = nd.GetDocumentByUNID(nve.UniversalID);         
     ndoc.CopyToDatabase(nd2);
 }
 //End loop.
 //All documents are copied.

结果是我最终得到了一个目标 NSF,它复制了所有文档。假设所有文件夹也都在那里。但是,文件夹中没有任何文档。每个文档都标记为已读。

如何解决文件夹和未读问题?

4

2 回答 2

5

FolderReferences后端类中的 NotesDocument 类中有一个属性。我不能 100% 确定该属性是否在 COM 类和 C# 互操作中公开,但如果是,您可以将其与PutInFolder()方法一起使用来解决部分问题。

就已读/未读标记而言,关键问题是您是否只关心自己的已读/未读状态,或者您是否试图为数据库的所有用户保留它。如果您只关心自己的未读标记,那么您也许可以使用该类的getAllUnreadDocuments()方法NotesDatabase——但这需要 Notes/Domino 8 或更高版本(在您的代码运行的机器上),而且我不是确定此方法(或其NotesNoteCollection返回的类)是否通过 C# 的 COM/互操作接口公开。如果它可用,那么您可以遍历集合并使用该MarkUnread()方法。如果您关心所有用户的未读标记,那么我不确定是否有办法做到这一点——但如果有,则需要使用来自 Notes C API 的调用。

于 2013-02-08T01:22:01.053 回答
2

关于移动到文件夹的另一个想法,特别是如果数据库没有设置为FolderReferences工作:

您可以遍历从 NotesDatabase 对象的 Views 属性获得的 NotesView 对象数组。每个 NotesView 都有一个属性,告诉您它是否是一个文件夹。

了解所有文件夹后,您可以在每个文件夹中进行迭代并收集其中包含的 NotesDocument 列表。然后通过将这些信息存储在字典中,您可以在处理每个文档时将其用作查找以确定需要将其放置在哪个文件夹中。

像这样的东西(未经测试):

object oViews = nd.Views;
object[] oarrViews = (object[])oViews;
Dictionary<string, List<string>> folderDict = new Dictionary<string, List<string>>();
for (int x=0; x < oarrViews.Length - 1; x++)
{
    NotesView view = viewArray[x];
    if (view.IsFolder) 
    {
        NotesDocument doc = view.GetFirstDocument();
        while (doc != null)
        {
            // Populate folderDict Dictionary by setting
            // document's UNID as Key, and adding folder name to List
        }
    }
}

然后在你的循环中:

//Copy document to second database.
NotesDocument ndoc = nd.GetDocumentByUNID(nve.UniversalID);  
NotesDocument newDoc = ndoc.CopyToDatabase(nd2);

if (folderDict.ContainsKey(nve.UniversalID)) {
    foreach (var folderName in folderDict[nve.UniversalID]) {
        newDoc.PutInFolder(folderName, true);
    }
}       
于 2013-02-08T01:55:03.430 回答