我正在使用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)我似乎仍然在我访问的每个文件夹中都有“表单”文件夹! 现在正在努力,但任何想法将不胜感激。
答案 0 :(得分:2)
选项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!
}