If you’re here, it can only mean one thing: Your users have created a folder and filename path in SharePoint that is so long that they’re now getting errors, and they can’t edit the document in Office applications. Like a burrowing parasite, the office document document has gone deeper and deeper into a convoluted folder structure until the URL exceeds the SharePoint limit of 260 characters.
It’s called Longurlitis, and while painful, it is curable.
Take this (not a real world) example:
http://sharepoint.company.com/Documents/Dave%20Documents/My%20Administrator%20Told%20Me%20To%20Use/
Metadata%20but%20what%20does%20he%20know/I’ll%20show%20him/
You’ll%20take%20these%20folders%20away%20from%20my%20cold%20dead%20hands/
Mwahahahahahahahahahahahahahahahahahaha/
Dave’s%20Word%20Document%20With%20Meeting%20Minutes%20From%201992%20
About%20That%20Upcoming%20Millenium%20Bug%20No%20I%20Can’t%20Get%20Rid%20Of%20These/
Meeting%20Minutes%20June%20Fourteenth%201992%20FINAL%20VERSION%20DRAFT%20v482.doc
Ouch, that hurt my everything.
Now when the user tries to do anything with this file, you get this:

This issue has been discussed at fairly great length a number of places, and by SharePoint heavyweights like Joel Oleson.
The problem is fairly straightforward when it’s only one or two files, but what do you do when this isn’t a one-off, but a full-on infestation of Longurlitis? I recently came across over 700 files with Longurlitis in an old site that’s being decommissioned. After running the SharePoint Site Extraction script, I found a number of files missing. The reason being is that the script’s BinaryWriter chokes on the insane URL length.
To that end I’ve created the script below that finds all files in a given site that with a URL that exceeds 260 characters. You can also download all of the files by un-commenting the designated line. Also if you’d like to spit out an inventory CSV file with the URL and number of characters, just use the Out-File Cmdlet like so:
FindLongPaths.ps1 | Out-File -filepath C:\wherever\LongFiles.csv
Note: I had to use a character other than a comma for the CSV output, because it’s possible and likely that the same users who are creating these files are also putting commas in the filename. Because the hash character (#) is forbidden in SharePoint URLs, it works well for delimiting the output.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue #Where to Download the files to. $destination = "C:\Wherever" #The site to extract from. Make sure there is no trailing slash. $site = "http://sharepoint.company.com/site" # Function: DownloadLongFiles # Description: Downloads all documents with a URL > 260 characters # Variables # $folderUrl: The Document Library to Download function DownloadLongFiles($folderUrl) { $folder = $web.GetFolder($folderUrl) foreach ($file in $folder.Files) { $encodedURL = $file.url -replace " ", "%20" $FullURL = $site+'/'+$encodedURL $URLWithLength = $FullURL+'#'+$FullURL.length $Filename = $file.Name $Downloadpath = $destination+'\'+$Filename if ($FullURL.length -ge 260) { #Uncomment the line below to download the files. #HTTPDownloadFile "$FullURL" "$Downloadpath" Write-Host $FullURL Write-Host $destination Write-Host $URLWithLength Write-Output $URLWithLength } } } # Function: DownloadSite # Description: Calls DownloadLongFiles recursiveley to download all documents with long file names in a site. # Variables # $webUrl: The URL of the site to download all document libraries function DownloadSite($webUrl) { $web = Get-SPWeb -Identity $webUrl foreach($list in $web.Lists) { if($list.BaseType -eq "DocumentLibrary") { DownloadLongFiles $list.RootFolder.Url #Download files in folders foreach ($folder in $list.Folders) { DownloadLongFiles $folder.Url } } } } # Function: HTTPDownloadFile # Description: Downloads a file using webclient # Variables # $ServerFileLocation: Where the source file is located on the web # $DownloadPath: The destination to download to function HTTPDownloadFile($ServerFileLocation, $DownloadPath) { $webclient = New-Object System.Net.WebClient $webClient.UseDefaultCredentials = $true $webclient.DownloadFile($ServerFileLocation,$DownloadPath) } #Download Site Documents + Versions DownloadSite "$site" |