R – SharePoint 2007, how to check if a folder exists in a document library

sharepointwss

I am accessing SharePoint via its web services… Which are a bit limited, as a result I have turned to WebDav to perform some create folder functionality…

I have a document library, and I am about to create a folder using webdav, but I can't find any documentation on the internet or anywhere else on how to check if a folder already exists using webdav, so is there a way to check if a folder exists in a document library in SharePoint, any hack and slash methods welcome!

Best Answer

Somehow, I don't get your question. First sentence states you are using web service (I'd normally understand it as the SOAP web services provided by SharePoint). The next one says you are using WebDAV which is a completely different protocol.

So, WebDAV is the protocol "Windows Explorer" uses to access SharePoint, if you open it it "Explorer mode". Since all these requests are actually HTTP requests, you can spy on them, using the "Fiddler" tool.

I believe, before opening a folder, Windows Explorer tries to query sharepoint, if such folder exists. If I try to open an unexistant path \\mysrv\sites\myweb\mylib\notthere (but \\mysrv\sites\myweb\mylib is an existing document library!) thru windows explorer, the last HTTP call I see is:

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

Where SharePoint responds with: a list of subfolders and pages in this folder (very long XML, but it contains items like this):

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

If the contained element is a folder, it must have "D:isFolder" value "t". This way you can find, if the parent folder contains the folder you are going to create.

EDIT: created a small c# sample which first reads the result stream and then parses the result a bit. You need to make it better, to see if the list contains the folders you need or not.

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();
}