Getting ParentFolder from a custom list

Getting items from a list is something most developers do a lot, and one of the nice functions you can use is the SPListItem.File.ParentFolder since it returns (what else couldt it do), the parentfolder. Especialy when you’re creating something with navigation like breadcrumbs or tabs, that function will provide you with enough information to display the desired info.

However this seems to have a little limitation, it only works on standard libraries that actually contains ‘items’ which means that if you are trying to use it on a custom list it won’t work. And most developers use custom lists / content types. I hit the same problem, but luckily someone posted a nice solution to this on MSDN (credits go to Donzola).

The following code will allow you to get the parent folder of a list item:

///<summary>
///Returns the parent folder of an item in a list.
///</summary>
///<param name="itemToFind">Item whose parent folder you are looking for.</param>
///<param name="folder">Folder object to look in.  Pass null to start fromthe root.</param>
///<returns>SPFolder object of parent folder or null if item isn't in a folderor if the item isn't found.</returns>

static SPFolder GetParentFolder(SPListItem itemToFind, SPFolder folder)
{
  SPQuery query = new SPQuery();
  query.Folder = folder;
  SPListItemCollection items = itemToFind.ParentList.GetItems(query);

  foreach (SPListItem item in items) {
    if (item.ID == itemToFind.ID) {
      return (folder);
    }

    if (item.Folder != null) {
      SPFolder resultFolder = GetParentFolder(itemToFind, item.Folder);
      if (resultFolder != null) {
        return (resultFolder);
      }
    }
  }

  return (null);
}

So adding that function allows you to get a parentfolder with: SPFolder parentFolder = GetParentFolder(item, null);

Final note; make sure that you check if the parentFolder != null before you use it.