Windows phone 7 筛选出windows phone 7上的隐藏和系统sharepoint文件夹
我正在使用Microsoft.sharepoint.Client命名空间中的类处理sharepoint网站。 由于我正在使用Windows Phone 7,因此找不到SPFolderCollection/SPFolder类 我需要过滤掉隐藏的文件夹和系统文件夹(例如_vti_pvt) 我发现一个例子如下: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 !=
// 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...
}
}
要点:
- 这种方法的优点是只使用常规文件夹 返回