wss3.0 对文档库的一些操作

最近有个功能需求,做文档库的数据迁移。把操做文档库的一些代码在这跟大家分享。

1. 使用该类SPDocumentLibrary来实现一些对文档库的操作,文档库只是列表的一种特殊类型,所以当我们使用如下代码的时候,显示出的list是包括文档库的。

SPWeb site = SPContext.Current.Web;
foreach (SPList list in site.Lists)
{
// 所有的列表,当然也包括文档库
}

2. 文档库和列表的主要不同点是文档库是用来存储文档的,SPDocumentLibrary类是继承自SPList的,所以当你获得SPList对象的时候就可以判断该列表是否为文档库

public bool IsListAlsoDocumentLibrary(SPList list)
{
  if(list is SPDocumentLibrary)
    return true;
  else 
    return false;
}

3. 站点可能有很多隐藏的文档库,比如webpart库,站点模板库,母板页库,我们可以把他们显示在一个DropDownList中,代码如下:

SPWeb site = SPContext.Current.Web;
foreach (SPList list in site.Lists)
{
  if(list is SPDocumentLibrary && !list.Hidden)
  { 
     SPDocumentLibrary docLib = (SPDocumentLibrary)list; 
     lstTargetLibrary.Items.Add(new ListItem(docLib.Title, docLib.ID.ToString()));
       }
}

使用下面方法即可实现上面所述的功能。

SPSite site = new SPSite(resourceUrl.Text);
                              SPWeb web = site.RootWeb;
                              SPListCollection docs = web.GetListsOfType(SPBaseType.DocumentLibrary) ;
                              foreach (SPList list in docs)
                              {
                                  if(!list.Hidden)
                                    this.resouseCb.Items.Add(list.Title);
                              }

4.1 由于文档库在wss的object model中也是SPList,所以每一个文档也是一个SPlistItem对象,然而在文档库中的文档也可以为一个SPFile对象,所以我们可以通过这两种方法是操作。

void ProcessDocuments(SPDocumentLibrary docLib)
{
   foreach(SPListItem item in docLib.Items)
   {
     // 操作SPListItem对象
     SPFile file = item.File;
     // 操作SPFile 对象
   }
}

4.2 SPListItem对象记录了一个文档的ID,对栏元数据的读写,如下代码:

foreach (SPListItem item in docLib.Items)
{
  int itemID = item.ID;   // 读元数据栏信息
  string clientColumnValue = item["Client"].ToString();
  //写元数据栏信息
   item["Client"] = "AdventureWorks";
  item.Update();
}

4.3 SPFile一般来控制文档的内容,比如下面代码:

foreach (SPListItem item in docLib.Items)
{   
   if(item.FileSystemObjectType == SPFileSystemObjectType.File)
   {      
     SPFile file = item.File;  
     int versionCount = file.Versions.Count; 
     // 是否被签出 
      DateTime checkedOutDate = file.CheckedOutDate;    
     // 基于流的方式打开处理   
      using(Stream fileContents = file.OpenBinaryStream())    
     {}  
   }
}

5. 这里需要注意的是如果文档库中有文件夹的时候,对应object model为一个内容为SPListItem的Items的集合,所以上面的代码中我在把SPListItem转换为SPFile前来判断SPFileSystemObjectType属性。

  如果你仅仅想把站点中文档库都列举出来,你还可以通过如下方法

void ProcessDocumentsAtRoot(SPDocumentLibrary docLib)
{
   foreach (SPFile file in docLib.RootFolder.Files)
   {
     // program against file using SPFile class
   }
}

6.1 添加一个新的文件到文档库中,下面是主要代码:

protected void CreateDocument()
{
  SPSite siteCollection = SPContext.Current.Site;
  SPWeb site = SPContext.Current.Web;
  Guid libraryID = new Guid(lstTargetLibrary.SelectedValue);
  SPDocumentLibrary library = (SPDocumentLibrary)site.Lists[libraryID];
  string documentName = txtFileName.Text;
  string libraryRelativePath = library.RootFolder.ServerRelativeUrl;
  string libraryPath = siteCollection.MakeFullUrl(libraryRelativePath);
  string documentPath = libraryPath + "/" + documentName;
  Stream documentStream = new MemoryStream();
  StreamWriter writer = new StreamWriter(documentStream);
  writer.Write(txtDocumentBody.Text);
  writer.Flush();
  Hashtable docProperties = new Hashtable();
  docProperties["vti_title"] = "This is a test title";
  docProperties["Color"] = "Green";
  site.Files.Add(documentPath, documentStream, docProperties, true);
  Response.Redirect(libraryPath);
}

6.2 使用上面代码创建的文档,我们只是指定了"vti_title"和"Color"两个元数据的信息,wss默认为我们生成了许多,我们可以通过下面的代码来查看系统到底为我们做了什么?

SPList list = site.Lists["CaryPro"]; 
foreach (SPListItem item in list.Items) 
{ 
   SPFile file = item.File; 
   foreach (DictionaryEntry entry in file.Properties) 
   { 
     Console.WriteLine(entry.Key + ":" + entry.Value); 
   } 
   break; 
}

7 使用Feature创建新的文档库实例

  7.1 你可以使用网站设置中的UI,也可以自定义一个基于某个内容类型的文档库,我们可以Feature方式提供某个标准文档库的实例,如下设置:

<ListInstance
FeatureId="00BFEA71-E717-4E80-AA17-D0C71B360101"
TemplateType="101"
Id="CaryPro"
Description="Document Library for CaryPro"
OnQuickLaunch="True"
Title="CaryPro"
Url="CaryPro"
> 
</ListInstance>

FeatureId必须是个GUID,TemplateType需要为文档库的类型,就是101

  7.2 下面的配置为,在TestData目录有相应的文档,这些文档会默认就放到该文档库中

<Module Name="TestData" List="101" Path="TestData" Url="CaryPro" > 
<File Url="AdventureCaryPro.docx" Type="GhostableInLibrary" /> 
<File Url="ContosoCaryPro.docx" Type="GhostableInLibrary" />
 <File Url="WingtipCaryPro.docx" Type="GhostableInLibrary" />
 </Module> 

7.3 设置默认的文档库模板

<Module Name="WordTemplate" List="101" Url="CaryPro/Forms">
<File Url="CaryProTemplate.dotx" Type="GhostableInLibrary" />
</Module> 

7.4 FeatureActivated中创建文档库

public override void FeatureActivated(SPFeatureReceiverProperties properties) 
{ 
  SPWeb site = (SPWeb)properties.Feature.Parent; 
  SPDocumentLibrary libProposals = (SPDocumentLibrary)site.Lists["CaryPro"]; 
  string templateUrl = @"CaryPro/Forms/CaryProTemplate.dotx"; 
  libProposals.DocumentTemplateUrl = templateUrl; 
  libProposals.Update(); 
}

 

posted @ 2012-06-25 09:36  雷鸣_Sky  阅读(319)  评论(0编辑  收藏  举报