How to get all folders in a SPList, then checking permission "Contribute" for current user

Dương Diễm Quỳnh picture Dương Diễm Quỳnh · Aug 11, 2011 · Viewed 9.3k times · Source

I have a sharepoint list like that:

List
---------Folder 1
-----------------Item 1
-----------------Item 2
---------Folder 2
-----------------Item 1
-----------------Item 2
---------Folder 3
-----------------Item 1
-----------------Item 2
  1. How can I get all Folders in List?

  2. After that checking if current user has Contribute permission on Folder 1, Folder 2, Folder 3?

Answer

Pedro Jacinto picture Pedro Jacinto · Aug 11, 2011

To get the list of folders of a list you can use the Folders property of the SPList object:

private SPFolderCollection GetListFolders(SPList list) {
  return list.Folders; 
  // you can also do:
  // return list.Folders.Cast<SPFolder>().ToList();
  // to return a List<SPFolder> instead of a SPFolderCollection
}

To check if a given user has Contribute permission on a folder you need to get the SPListItem associated with the SPFolder, check for a RoleAssignment of the given user and check its RoleDefinitionBindings for the Contribute Role Definition:

private bool HasContributePermissionOnFolder(SPFolder folder, SPPrincipal user) {
  var contributePermission = folder.ParentWeb.RoleDefinitions["Contribute"];

  var roleAssignementsOfUser = folder.Item.RoleAssignments.Cast<SPRoleAssignment>()
    .Where(ra => ra.Member == user);

  var hasContributePermission = roleAssignementsOfUser
    .Where(ra => ra.RoleDefinitionBindings.Contains(contributePermission)).Count() > 0;

  return hasContributePermission;
}

Usage example

//remember to add using System.Linq; for the above code to work
//SPList list = <your list>;
//SPWeb web = <your web>;

var folders = GetAllFoldersOfList(list);

foreach (SPFolder folder in folders) {
  if (HasContributePermissionOnFolder(folder, spWeb.CurrentUser)) {
  // do stuff
}