过滤掉Windows Phone 7上的隐藏和系统共享点文件夹

时间:2013-03-08 12:19:30

标签: windows-phone-7 sharepoint

我正在使用Microsoft.Sharepoint.Client命名空间中的类来使用sharepoint站点。 当我在Windows Phone 7上工作时,我找不到SPFolderCollection / SPFolder类。

我需要过滤掉隐藏的文件夹和系统文件夹(例如_vti_pvt)​​。

我找到了一个例子如下:

// filter the folders like “_catalogs” or “_private”
                if (folder.ParentListId != Guid.Empty)
                {
                    SPList list  = web.Lists[folder.ParentListId];
//filter the folders like “Reporting Templates” or “IWConvertdForms”
                    if (list.Hidden == false)

(摘自http://go4answers.webhost4life.com/Example/know-spfolder-invisible-visible-27871.aspx)。

但是,由于我没有'SP'类,我无法在Windows Phone上实现它(没有ParentListId方法)。

非常感谢任何想法/解决方法。

谢谢。

P.S。请注意,我不惜一切代价避免使用CAML;我只需要能够列出和检索文件和文件夹的URL,我不需要使用列表或通知。

更新 所以我似乎可以规避如下限制:

Foldercollection folder_assist = new FolderCollection( WHAT DO I PUT HERE??? );
    ctx.Load(folders);
                ctx.ExecuteQueryAsync(delegate(object sender1, ClientRequestSucceededEventArgs args)
                {
                foreach (Folder f in folders)
                {
                    ctx.Load(f.ParentFolder);
                }
                ctx.ExecuteQuery();
                foreach (Folder f in folders)
                {
                    List ejh;
                     // if we are in the top folder, the .parentfolder may be null
                    if (f.ParentFolder != null && f.ParentFolder.Name != "")
                    {
                        ejh = ctx.Web.Lists.GetByTitle(f.ParentFolder.Name);
                    }
                    else
                    {
                        ejh = ctx.Web.Lists.GetByTitle(f.Name);
                    }
                    ctx.Load(ejh);

                    try
                    {
                        ctx.ExecuteQuery();
                    }
                    catch
                    {
                        ejh = null;
                    }
                    if (ejh != null)
                    {
                        if (ejh.Id != Guid.Empty)
                        {
                            if (ejh.Hidden == false)
                            {
                     folder_assist.Add(f.ServerRelativeURL;
                         }
                        }
                    }
                } 
                win.Dispatcher.BeginInvoke((Action)(() => DO SOME WORK...

            }, delegate(object sender1, ClientRequestFailedEventArgs args)
                {
                   win.Dispatcher.BeginInvoke((Action)(() => MessageBox.Show("something went wrong" + args.ToString())));
                });

我现在遇到的问题是第一行 - 似乎Microsoft.Sharepoint.FolderCollection构造函数需要上下文(我已经并且可以轻松传递)和ObjectPath类型,我没有,因为我只需要一个占位符,用于收集所有未隐藏且不特殊的文件夹。

我如何解决这个问题?

更新2

好的,非常明显的结果,我只是使用List<Folder>作为fassist。

然而,我注意到还有两件事:

a)我的解决方案的表现相当令人震惊。在之前需要片刻获取列表的时候(当我没有在异步线程中过滤时),现在需要大约10-20秒来获取列表(我在服务器上只有一些项目!)。

任何想法/建议? (真正的问题是我不能将文件夹集合传递回UI线程来解析并逐个添加,因为我仍然需要为parentFolder执行query。如果我尝试在foreach()循环中执行异步操作在UI线程中,我得到一个非实例化对象,因为UI线程不等待查询的执行。如果我使用AutoResetEvent等待,UI线程就会被锁定。而且WP7不允许使用ClientContext.Executequery( )在UI线程中.Bummer。)

b)我似乎仍然在我访问的每个文件夹中都有“表单”文件夹! 现在正在努力,但任何想法将不胜感激。

2 个答案:

答案 0 :(得分:2)

如何排除&#34; system&#34;使用SharePoint CSOM的文件夹

选项1

Folder class公开Folder.ListItemAllFields property,指定与该文件夹关联的列表项,用于&#34; system&#34;文件夹对应的列表项不存在。

以下示例演示如何加载文件夹并验证文件夹是否是常规文件夹,以及&#34; system&#34;文件夹:

using (var ctx = new ClientContext(webUri))
{

      var list = ctx.Web.Lists.GetByTitle(listTitle);
      var folder = list.RootFolder;
      ctx.Load(folder);
      ctx.Load(folder.Folders, fcol => fcol.Include(f => f.Name, f => f.ServerRelativeUrl, f => f.ListItemAllFields));
      ctx.ExecuteQuery();
      foreach (var subFolder in folder.Folders)
      {
           bool systemFolder = subFolder.ListItemAllFields.ServerObjectIsNull != null && subFolder.ListItemAllFields.ServerObjectIsNull.Value;
           if(!systemFolder)
              //Process regular Folder...
      }
 }

选项2

下面演示了通过SharePoint CSOM使用CAML查询加载文件夹的另一种方法

using (var ctx = new ClientContext(webUri))
{

    var list = ctx.Web.Lists.GetByTitle(listTitle);
    var items = list.GetItems(CamlQuery.CreateAllFoldersQuery());
    ctx.Load(items,icol => icol.Include(i => i.Folder));
    ctx.ExecuteQuery();
    var folders = items.Select(i => i.Folder);
    foreach (var folder in folders)
    {
        //Process folder...
    }
}

关键点:

  • 此方法的优点是只有常规文件夹 返回

答案 1 :(得分:0)

类在其前面没有SP的原因是您使用的示例是服务器对象模型,这只在安装了SharePoint的服务器上运行。

您使用的Windows Phone上的版本是客户端对象模型,并且在所有类中都没有SP前缀。

理想情况下,为了回答这个问题,我需要知道你在哪里获得文件夹的引用?网站,网站列表?或者你为什么要枚举这些文件夹?

FolderCollection必须来自客户端对象模型中的某个对象。

e.g。 ctx.Web.Folders将返回一个您可以枚举的FolderCollection,而不仅仅是创建一个新的FolderCollection。

Web和List等大多数更高级别的对象通常都有.Folders属性,您可以在不使用CAML的情况下检索文件夹列表。

您可以尝试使用此代码。

        ClientContext ctx = new ClientContext("http://yoururl");

        var webFolders = ctx.Web.Folders;
        ctx.Load(webFolders);
        ctx.Load(ctx.Web.Folders, folders => folders.Include(folder => folder.ParentFolder));
        ctx.Load(ctx.Web.Folders, folders => folders.Include(folder => folder.Folders));

        ctx.ExecuteQuery();
        foreach (var folder in webFolders)
        {
           // Do stuff here!
        }

它将从Web(实际上是根文件夹)及其父项和子项加载所有文件夹。我仍然迷失在如何以有效的方式隐藏文件夹。

请参阅我的评论,为什么我认为代码运行缓慢。

编辑:

您可以尝试使用Web来获取所有文档库。

        var webLists = ctx.Web.Lists;
        ctx.Load(webLists);

        // request that List.RootFolder is returned
        ctx.Load(ctx.Web.Lists, lists => lists.Include(list => list.RootFolder ));
        // request that RootFolder.Folders is returned
        ctx.Load(ctx.Web.Lists, lists => lists.Include(list => list.RootFolder.Folders ));
        // only return lists with a BaseType of 101 (Document Library)
        ctx.Load(ctx.Web.Lists, lists => lists.Where(list => list.BaseTemplate == 101));

        ctx.ExecuteQuery();
        foreach (var list in webLists)
        {
            var rootFolder = list.RootFolder;
            // Do stuff here!
        }