Technology Toolbox

Your technology Sherpa for the Microsoft platform

Jeremy Jameson - Founder and Principal

Search

Search

Using the SharePoint API to Configure an Expiration Policy on a Document Library

Note

While it typically takes less than a minute or two to configure an expiration policy on a SharePoint document library, there may still be reasons why you want to do this using the SharePoint object model instead.

For example, suppose I have a "Temporary Files" document library for which I want the files to be deleted approximately one day after they are added to the library.

The following C# code shows how to configure an expiration policy on the specified document library (passed as an SPList object):

using Microsoft.Office.RecordsManagement.InformationPolicy;
using Microsoft.SharePoint;
...
        private const string expirationPolicyFeatureId =
            "Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration";

        private static void ConfigureExpirationPolicy(
            SPList tempFilesLibrary)
        {
            Debug.Assert(tempFilesLibrary != null);

            // HACK: Refresh the SPList object in order to avoid
            // the following error when calling Policy.CreatePolicy:
            //
            // "The object has been updated by another user since it was last
            // fetched."
            SPList tempFilesLibrary2 =
                tempFilesLibrary.ParentWeb.Lists[tempFilesLibrary.ID];
            
            SPContentTypeId documentContentTypeId =
                tempFilesLibrary2.ContentTypes.BestMatch(
                    SPBuiltInContentTypeId.Document);

            SPContentType documentContentType =
                tempFilesLibrary2.ContentTypes[documentContentTypeId];

            Debug.Assert(documentContentType != null);
            
            Policy policy = Policy.GetPolicy(documentContentType);

            if (policy == null)
            {
                Policy.CreatePolicy(documentContentType, null);
                policy = Policy.GetPolicy(documentContentType);
            }

            if (policy.Items[expirationPolicyFeatureId] == null)
            {
                string customData =
"<data>"
    + "<formula id=\"Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn\">"
        + "<number>1</number>"
        + "<property>Created</property>"
        + "<period>days</period>"
    + "</formula>"
    + "<action type=\"action\" id=\"Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.MoveToRecycleBin\" />"
+ "</data>";

                policy.Items.Add(expirationPolicyFeatureId, customData);
            }
        }

This code adds an expiration policy to the library if it hasn't yet been configured. If an expiration policy has been configured on the document library, then it it ignored (because the policy may have been modified by an administrator -- for example, to increase the time period used to determine which files to delete).

Note

As shown in the HACK comment above, I fetch a new SPList object in order to avoid the following error when configuring the expiration policy immediately after creating a new document library:

The object has been updated by another user since it was last fetched.

This error occurred in Microsoft Office SharePoint Server (MOSS) 2007 -- although I just ran a quick test in SharePoint 2010 and it looks like this may no longer be an issue in the new version.

In my next post, I'll explain more about storing files temporarily in SharePoint.

Comments

No comments posted yet.

Add Comment

Optional, but recommended (especially if you have a Gravatar). Note that your email address will not appear with your comment.
If URL is specified, it will be included as a link with your name.

To prevent spam from being submitted, please select the following fruit: Cherries

Strawberry
Watermelon
Pear
Cherries
Grapes
Apple
 
Please add 3 and 2 and type the answer here: