SharePoint 2007, как проверить, существует ли папка в библиотеке документов
Я получаю доступ к SharePoint через его веб-службы... которые немного ограничены, в результате я обратился к WebDav для выполнения некоторых функций создания папки...
У меня есть библиотека документов, и я собираюсь создать папку с помощью WebDAV, но я не могу найти в Интернете или где-либо еще документацию о том, как проверить, существует ли папка с помощью WebDAV, так что есть ли способ проверить если папка существует в библиотеке документов в SharePoint, любые методы взлома и слеша приветствуются!
2 ответа
Почему-то я не понимаю твой вопрос. В первом предложении говорится, что вы используете веб-сервис (обычно я понимаю его как веб-сервисы SOAP, предоставляемые SharePoint). Следующий говорит, что вы используете WebDAV, который является совершенно другим протоколом.
Итак, WebDAV - это протокол, который "Проводник Windows" использует для доступа к SharePoint, если вы откроете его "Режим обозревателя". Поскольку все эти запросы на самом деле являются HTTP-запросами, вы можете следить за ними, используя инструмент "Fiddler".
Я полагаю, что перед открытием папки Windows Explorer пытается запросить общий ресурс, если такая папка существует. Если я попытаюсь открыть несуществующий путь \\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();
}
Вам не нужно, если оно уже существует, попытка создать новую папку с таким именем "молча" вернет уже существующую папку.