This is generally because in order to move (rename) a file in Sharepoint, the user must have "delete" permission on list.
Provided the users have enough permission, then the code below works. The trick here is to use an SPFile object to update the "Name" property, whilst using an SPListItem object to control the files checkin/out status.
Keen readers will see that I am doing a ValidateFormDigest() in order to prevent the "Page Validation" error if this is caused from a form's POST action, but there is also a "web.AllowUnsafeUpdates = true;" command. I would prefer not to allow unsafe updates and would recommend you keep this line uncommented, but I have left it in in order to give you an option if you find that this still does not work properly in your situation.
using (SPSite site = new SPSite(SPContext.Current.Web.Url)) { using (SPWeb web = site.OpenWeb()) { try { SPUtility.ValidateFormDigest(); SPListItem target = web.GetListItem(fileUrl); // fileURL should be set to the full path of the document you are changing if (target.File.CheckOutType == SPFile.SPCheckOutType.None) { //web.AllowUnsafeUpdates = true; // Shouldn't need this with the validateformDigest try { target.File.CheckOut(); SPFile filet = web.GetFile(target.Url); filet.Item["Name"] = newName; // newName is the new name of the file target.Update(); } catch (Exception ex) { web.AllowUnsafeUpdates = false; target.File.UndoCheckOut(); ShowErrorMessage("Error validating document: " + ex.Message); // Deal with error return; } target.File.CheckIn("", SPCheckinType.MajorCheckIn); // Make major version web.Update(); web.AllowUnsafeUpdates = false; } catch (Exception ex) { ShowErrorMessage("Error: " + ex.Message); //Deal with error //throw; } finally { web.AllowUnsafeUpdates = false; } } }
No comments:
Post a Comment