UPDATE: This works but there are significant limitations which are described in the comments. This may still be useful in some cirumstances.
UPDATE 2: In my current project, users always upload documents. As a result, I don’t run into a problem where MS Word is running and thinks that the file was renamed on it. I did run into a problem, "the file was modified by someone else" and solved this via a simple semaphore type flag. Users need to change a meta data field from its default value to something else. The itemupdated() receiver looks for a valid value there before actually performing the rename and since then, I have not had any problems. Your mileage may vary.
I have a client requirement to change the name of files uploaded to a specific document library to conform with a particular naming convention. The API does not provide a "rename()" method. Instead, we use "MoveTo(…)". Here is a minimal bit of code to accomplish this:
public override void ItemAdded(SPItemEventProperties properties) { SPFile f = properties.ListItem.File; f.MoveTo(properties.ListItem.ParentList.RootFolder.Url + "/xyzzy.doc"); f.Update(); } |
The only tricky bit is the "properties.ListItem.ParentList.RootFolder.Url". The MoveTo() method requires a URL. That mashed up string points me to the root folder of my current document library. This allows me to avoid any hard coding in my event receiver.
This is a more useful version that does the same thing, but assigns the name of the file to "Title":
public override void ItemAdded(SPItemEventProperties properties) { DisableEventFiring(); // Assign the title of this item to the name of file itself. // NOTE: This assignment must take place before we modify the file itself. // Calling update() on the SPFile seems to invalidate the properties in // some sense. Updates to "Title" failed until that change (and update() call) // were moved in front of the change to the file name. properties.ListItem["Title"] = properties.ListItem.File.Name; properties.ListItem.Update(); SPFile f = properties.ListItem.File; // Get the extension of the file. We need that later. string spfileExt = new FileInfo(f.Name).Extension; // Rename the file to the list item's ID and use the file extension to keep // that part of it intact. f.MoveTo(properties.ListItem.ParentList.RootFolder.Url + "/" + properties.ListItem["ID"] + spfileExt); // Commit the move. f.Update(); EnableEventFiring(); } |