zoukankan      html  css  js  c++  java
  • 使用对象模型操作文档库(DocumentLibrary)

    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()));
    }
    }

    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();
    }

    作者:生鱼片
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    路由守卫
    this.$nextTick() 的一些理解
    3d饼图
    element ui 可编辑的表格
    vue 路由传参
    vue+element ui 时间格式化
    element ui 选择期 传对象
    数据结构学习第十天
    数据结构学习第九天
    数据结构学习第八天
  • 原文地址:https://www.cnblogs.com/carysun/p/DocumentLibrary.html
Copyright © 2011-2022 走看看