tags:

views:

348

answers:

3

Hi, If i know the URL for a document, can I find the URL for sharepoint document library in which the document is present. The following are two sample URLs for a SharePoint site. The first document is present under the root of a document library. The second document is present under a folder "folder1" within the document library. Appreciate if there is anyway to know the URL for a document library (http:///sites/site1/DocLib/Forms/AllItems.aspx).

http:///sites/site1/DocLib/a.doc http:///sites/site1/DocLib/folder1/a.doc


Thanks for your replies. I am looking for a solution with MOSS OOTB web service or based on the URL pattern. Can we use any of these to acheive this please?

Thanks.

A: 

There are two different ways I do this, depending on the situation. Neither performs extremely well (important to note), though the second solution typically performs fairly well for our use cases.

The first is extremely simple:

private SPList GetListForFile(string fileUrl)
{
    using (SPSite site = new SPSite(fileUrl))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPFile file = web.GetFile(fileUrl);
            if (file.Exists)
            {
                return file.Item.ParentList;
            }
        }
    }
    return null;
}

The second is a little more complex. It does require you first chopping off the file part of the URL, then passing it in to the method to get the correct SPWeb, then finding the right list in the web.

private SPList GetListForFile(string fileUrl)
{
    using(SPWeb web = OpenWeb(GetFolderUrl(fileUrl)))
    {
        string listName = fileUrl.Replace(web.ServerRelativeUrl, "");
        listName = listName.Substring(0, listName.IndexOf('/'));
        return web.Lists[listName];
    }
}

private string GetFolderUrl(string fileUrl)
{
    return Regex.Replace(fileUrl, @"/[^/]+?\.[A-Z0-9_]{1,6}$", "",
        RegexOptions.IgnoreCase | RegexOptions.Singleline);
}

private SPWeb OpenWeb(string folderUrl)
{
    SPWeb web = null;
    while(web == null)
    {
        web = Site.OpenWeb(folderUrl);
        if (!web.Exists)
        {
            web.Dispose();
            web = null;
        }
        folderUrl = folderUrl.Substring(0, folderUrl.LastIndexOf("/"));
        if (folderUrl.Length == 0)
        {
            folderUrl = "/";
        }
    }
    return web;
}
Rex M
+1  A: 

The SPWeb object has a GetFile method, which takes the full file url.

SPFile file = web.GetFile(yoururl);

now it's easy to get to the SPList's url, by using the following:

string listUrl = file.Item.ParentList.DefaultViewUrl;

so, in a method together:

public string GetListUrlFromFileUrl(string fullFileUrl)
{
  using (SPSite site = new SPSite(fullFileUrl))
  {
    using(SPWeb myWeb = site.OpenWeb())
    {
      SPFile file = web.GetFile(fullFileUrl);
      return file.Item.ParentList.DefaultViewUrl;
    }
  }
}
Colin
A: 

Hi, Thanks for your replies. I am looking for a solution with MOSS OOTB web service or based on the URL pattern. Can we use any of these to acheive this please?

Thanks.

stranger001
@strange001 - you need to post this as an edit to your question. not an answer.
Metro Smurf