Windows phone 7 筛选出windows phone 7上的隐藏和系统sharepoint文件夹

Windows phone 7 筛选出windows phone 7上的隐藏和系统sharepoint文件夹,windows-phone-7,sharepoint,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 !=

我正在使用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)
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())));
                });
(示例取自)

但是,由于我没有“SP”类,所以无法在Windows Phone上实现它(没有ParentListId方法)

如有任何想法/解决办法,将不胜感激

多谢各位

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

更新 因此,我似乎可以绕过以下限制:

// 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)
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

好的,非常明显的结果,我只是用了fassist的
List

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

a) 我的解决方案的性能相当糟糕。以前获取列表需要花费一些时间(当我没有在异步线程中进行筛选时),现在获取列表需要10-20秒的时间(而我在服务器上只有少数项目!)

有什么想法/建议吗?(真正的问题是,我不能将folders集合传递回UI线程,以便逐个进行分析和添加,因为我仍然需要执行parentFolder的executequery在UI线程中循环,我得到一个非实例化对象,因为UI线程不等待查询的执行。如果我使用AutoResteEvent使其等待,UI线程将被锁定。WP7不允许在UI线程中使用ClientContext.Executequery()

b) 我似乎在我访问的每个文件夹中都有“表单”文件夹!
现在正在研究这个问题,但如果有任何想法,我们都将不胜感激。

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

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

理想情况下,要回答这个问题,我需要知道您从哪里获得文件夹的引用?网站、网站和列表?或者为什么要尝试枚举文件夹

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

e、 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!
        }
如何使用SharePoint CSOM排除“系统”文件夹 选项1

公开指定与文件夹关联的列表项,对于“系统”文件夹,相应的列表项不存在

以下示例演示如何加载文件夹并验证文件夹是常规文件夹还是“系统”文件夹:

选项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...
    }
}
要点:

  • 这种方法的优点是只使用常规文件夹 返回

感谢您的帮助,亚当,我正在创建一个导航逻辑。顶部对象是ctx.Web.Folders,然后当用户点击控件时,我将进入该文件夹的文件夹和文件等。但是,我需要过滤隐藏和系统(空Guid)文件夹,以便用户看不到StyleTemplates和_vti_pvt文件夹。使用服务器对象模型,我可以检查其他属性,然而在这里,我最终手动查询parentfolder,以便将其传递到ctx.Web.Lists.GetByTitle以检查隐藏和/或空Guid标志。我认为您不能直接使用服务器对象模型代码转换为客户端对象模型。主要是ClientContext.Web.Folders将返回无效列表的对象,如果您尝试调用List.GetByTitle(),这些对象将引发异常。如果您正在浏览SharePoint的文件结构,我不确定文件夹的使用情况。大多数最终用户将查看存储数据的特定列表。如果没有关于为什么要构建导航工具的上下文,就很难理解您要做什么,特别是当您向最终用户隐藏内容时。我还猜想,您的性能问题源于try-catch块被多次命中。Adam,我们的想法是仅从sharepoint上的文件夹检索文件和文件夹。我不使用列表,预期用户也不会使用列表。sharepoint网站结构包含一系列文档库。客户端应该能够从站点列出所有可用的文档库(而不是列表!)以查看文件和文件夹。客户机应该为用户提供导航列出的文件夹的能力,并为文件提供url链接(siteurl+ServerRelativeURL)。仅此而已,这是非常基本的