2009-12-22 62 views
1

我正在通过其Web服务访问SharePoint ......这是有限的,因此我转向WebDav执行一些创建文件夹功能..SharePoint 2007,如何检查文档库中是否存在文件夹

我有一个文档库,我即将创建一个文件夹使用webdav,但我无法找到任何文档在互联网上或任何其他地方如何检查一个文件夹是否已经存在使用webdav,所以是有一种方法可以检查SharePoint中的文档库中是否存在文件夹,欢迎使用任何黑客和斜杠方法!

回答

1

不知何故,我不明白你的问题。第一句话表明您使用的是Web服务(我通常将其理解为SharePoint提供的SOAP Web服务)。下一个说你正在使用WebDAV这是一个完全不同的协议。

因此,WebDAV是“Windows资源管理器”用来访问SharePoint的协议,如果你打开它,它就是“资源管理器模式”。由于所有这些请求实际上都是HTTP请求,因此您可以使用"Fiddler" tool来监视它们。

我相信,在打开文件夹之前,Windows资源管理器会尝试查询共享点,如果存在这样的文件夹。如果我尝试打开一个unexistant路径\\mysrv\sites\myweb\mylib\notthere(!但\\mysrv\sites\myweb\mylib是现有的文档库)直通Windows资源管理器,最后HTTP调用我看到的是:

PROPFIND /sites/myweb/mylib HTTP/1.1 
User-Agent: Microsoft-WebDAV-MiniRedir/6.1.7600 
Depth: 1 
translate: f 

哪里的SharePoint与回应:子文件夹和页面的列表这个文件夹(很长的XML,但它包含这样的项目):

<D:multistatus 
    xmlns:D="DAV:" 
    xmlns:Office="urn:schemas-microsoft-com:office:office" 
    xmlns:Repl="http://schemas.microsoft.com/repl/" 
    xmlns:Z="urn:schemas-microsoft-com:"> 
    <D:response> 
    <D:href>http://sites/myweb/mylib</D:href> 
    <D:propstat> 
     <D:prop> 
     <D:displayname>mylib</D:displayname> 
     <D:lockdiscovery/> 
     <D:supportedlock/> 
     <D:isFolder>t</D:isFolder> 
     <D:iscollection>1</D:iscollection> 
     <D:ishidden>0</D:ishidden> 
     <D:getcontenttype>application/octet-stream</D:getcontenttype> 
     <D:getcontentlength>0</D:getcontentlength> 
     <D:resourcetype> 
      <D:collection/> 
     </D:resourcetype> 
     <Repl:authoritative-directory>t</Repl:authoritative-directory> 
     <D:getlastmodified>2009-12-07T09:07:19Z</D:getlastmodified> 
     <D:creationdate>2009-11-06T13:30:26Z</D:creationdate> 
     </D:prop> 
     <D:status>HTTP/1.1 200 OK</D:status> 
    </D:propstat> 
    </D:response> 
    <!---List of other <D:response> elements --> 
</D:multistatus> 

如果包含的元素是一个文件夹,它必须有“d:isFolder”值“T”。这样你可以找到,如果父文件夹包含你要创建的文件夹。

编辑:创建一个小的c#示例,它首先读取结果流,然后解析一下结果。你需要做的更好,看看列表是否包含你需要或不需要的文件夹。

System.Net.HttpWebRequest oReq; 
string sUrl = "http://yoursite/sites/somesite/DocumentLibrary"; 
oReq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(sUrl); 

oReq.Method = "PROPFIND"; 
oReq.Credentials = System.Net.CredentialCache.DefaultCredentials; 
oReq.AllowAutoRedirect = true; 
oReq.UserAgent = "Microsoft-WebDAV-MiniRedir/6.1.7600"; 

//this causes all of the items to be enumerated, 
//if it is 0, only the folder itself is returned in the response 
oReq.Headers["Depth"] = "1"; 
oReq.Headers["translate"] = "f"; 
System.IO.StreamWriter oRequest = 
     new System.IO.StreamWriter(oReq.GetRequestStream()); 
oRequest.WriteLine(); 
oRequest.Close(); 
System.IO.StreamReader oResponse = 
     new System.IO.StreamReader(oReq.GetResponse().GetResponseStream()); 
string sResponse = oResponse.ReadToEnd(); 
oResponse.Close(); 

//done with the webclient stuff, check the results 

System.Xml.XmlDocument oMyDoc = new System.Xml.XmlDocument(); 
oMyDoc.LoadXml(sResponse); 
System.Xml.XmlNamespaceManager oNsMgr = 
     new System.Xml.XmlNamespaceManager(oMyDoc.NameTable); 
oNsMgr.AddNamespace("D", "DAV:"); 

System.Xml.XmlNodeList oAllResponses = 
     oMyDoc.SelectNodes(".//D:multistatus/D:response", oNsMgr); 

foreach (System.Xml.XmlNode oNode in oAllResponses) 
{ 
    Console.WriteLine("Name: " + 
         oNode.SelectSingleNode("./D:propstat/D:prop/D:displayname", 
         oNsMgr).InnerText); 

    if (oNode.SelectNodes("./D:propstat/D:prop/D:isFolder", oNsMgr).Count > 0) 
    { 
     Console.WriteLine("Is folder: " + 
       oNode.SelectSingleNode("./D:propstat/D:prop/D:isFolder", 
       oNsMgr).InnerText); 
    } 
    else 
    { 
     Console.WriteLine("Is folder: f"); 
    } 
    Console.WriteLine(); 
} 
+0

你可以提供一个C#示例如何以实用的方式使用这些信息吗? – 2010-01-05 12:17:03

+0

增加了一个例子 – naivists 2010-01-05 13:03:39

+0

谢谢,这看起来不错,将检查出来调查... – 2010-01-05 15:30:48

-3

不需要,如果它已经存在,试图用该名称创建一个新文件夹将“默默地”返回已经存在的文件夹。

相关问题