Sample code to either Calculate size of all files or Export Files from a web
I find myself debating the features of my blog here, vs https://spaces.msn.com/members/keithrichie
I think I'll utilize this blog space for developer related stuff, and my spaces one for everything else.
Besides, I don't like how the spaces site doesn't give me the option of how wide my blog entry spot can be.
Regardless, I wanted to post an update to the sample "Document Library" extraction code I wrote a while back.
// Sample code to either Calculate size of all files or Export Files from a web
// BEGIN Sample.cs
using System;using Microsoft.SharePoint;using System.IO;using System.Collections;namespace ExportWebFiles{ class AppClass { static string m_strExportDir = null; static bool m_RecurseWebs = false; static bool m_RecurseFolders = false; [STAThread] static void Main(string[] args) { // Assume that the first argument is a valid URL SPSite siteColl = new SPSite(args[0]); // For sample purposes, let's recurse everything // You could make this an arg m_RecurseWebs = true; // recurse ALL folders found on the web. // You could make this an arg m_RecurseFolders = true; // Get the path to dump the files to if we want to export the files, otherwise // this is a good code template to start from to file level analysis on your webs if(args.Length > 1 && (args[1].ToLower().CompareTo("-export")) == 0) m_strExportDir = args[2].ToString(); // You could use this code to run through all the files in every folder // on the web, to calculate the total size of the files in the web. // something like the following: long lTotalSize = 0; // Kick it off lTotalSize = GetWebDetails(siteColl.RootWeb); Console.WriteLine("Done!!!"); Console.WriteLine("Total size of all files in all folders is: " + lTotalSize); } static long GetWebDetails(SPWeb web) { long lWebTotal = 0; Console.WriteLine("Analyzing web " + web.Name + " at location " + web.ServerRelativeUrl); // enumerate over all the folders on the web foreach(SPFolder folder in web.Folders) { lWebTotal += GetFolderDetails(folder); } // Do the same for all subwebs if(m_RecurseWebs) { foreach(SPWeb subweb in web.Webs) lWebTotal += GetWebDetails(subweb); } Console.WriteLine("Total size of all files in all folders for " + web.Name + " is: " + lWebTotal); return lWebTotal; } static long GetFolderDetails(SPFolder folder) { Console.WriteLine("Processing Folder " + folder.ServerRelativeUrl); string strPath = null; long lFolderSize = 0; // If we're exporting the files from the web to the local file system, // create the appropriate file system folder if(m_strExportDir != null) { strPath = CheckPathAndCreate(folder.ServerRelativeUrl); } foreach(SPFile file in folder.Files) { // If we're exporting, stream out the files. if(m_strExportDir != null) { string sFileLoc = m_strExportDir + strPath + "\\" + file.Name; Console.WriteLine(" Exporting file " + file.Name + " to " + sFileLoc); byte[] binFile = file.OpenBinary(); FileStream fs = new FileStream(sFileLoc,FileMode.OpenOrCreate,FileAccess.Write); fs.Write(binFile,0,binFile.Length); fs.Close(); } // You could use this code to run through all the files in every folder // on the web, to calculate the total size of the files in the web. // something like the following: lFolderSize += file.Length; } if(m_RecurseFolders) { foreach(SPFolder subfolder in folder.SubFolders) GetFolderDetails(subfolder); } return lFolderSize; } // Break apart the URL and make a File System directory heirarchy from it if needed. static string CheckPathAndCreate(string ServerRelativeUrl) { string strPath; strPath = ServerRelativeUrl.Replace("/","\\"); // ServerRelativeUrl will begin with "/" so we'll be cool to just append it onto m_strExportDir System.IO.Directory.CreateDirectory(m_strExportDir + strPath); return strPath; } }}// END Sample.cs |