SharePoint Developer Support Team Blog

The Official blog of the SharePoint Developer Support Team

HOW TO: Change file extension of an existing item in SharePoint document library

HOW TO: Change file extension of an existing item in SharePoint document library

  • Comments 2
  • Likes

This post is a contribution from Aaron Miao, an engineer with the SharePoint Developer Support team.

For various reasons, people want to change the file extension of an existing item in a document library.  For example, with SharePoint 2007, files with JSON extension in document library can be opened without problems.  However, once you upgrade to SharePoint 2010, you cannot open the file anymore.  You’ll get an error similar to what’s shown below.

An error occurred during the processing of /Shared Documents/test.json.

The page must have a <%@ webservice class=”MyNamespace.MyClass” … %> directive.

In order to be able to see the JSON file content with SharePoint UI, one option is to change the file extension from JSON to TXT.  But you cannot change the name or display name of the file.  This can be accomplished by two methods as shown in the below samples that uses PowerShell.  And of course, you can do the same with SharePoint server OM.

Use SPFile.MoveTo

$site = Get-SPSite "http://yoursite"
$web  = $site.RootWeb
$list = $web.Lists["Shared Documents"]
$item = $list.GetItemById(0)
$file = $item.File
$file.MoveTo($item.ParentList.RootFolder.Url + "/” + ”test.txt")
$file.Update()

Use SPFile.CopyTo

$site = Get-SPSite "http://yoursite"
$web  = $site.RootWeb
$list = $web.Lists["Shared Documents"]
 
$caml = '
  <Where>
    <Eq>
      <FieldRef Name="File_x0020_Type" />
      <Value Type="Text">json</Value>
    </Eq>
  </Where>
'
 
$query = new-object Microsoft.SharePoint.SPQuery
$query.Query = $caml
 
$items = $list.GetItems($query)
  
foreach($item in $items)
{
      $file = $item.File
      $url = $file.ServerRelativeUrl
      $newurl = $url.replace(".json", ".txt")
      $file.CopyTo($newurl)
}

Hope this was helpful.

Comments
  • Hey Aaron,

    Good article.  My understanding is that SPFile.MoveTo() retains version history and metadata of the item which .CopyTo() creates a new copy that hence has no version history.

    Could you confirm that please?

  • Hi Cornelius, Both MoveTo() and CopyTo() keeps metadata (e.g Title, CustomCol). Yes, a new copied item from CopyTo() has no version history from source item.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment