SharePoint: Get Installation Directory Path
To get the directory path, which SharePoint was installed into, the SPUtility.GetGenericSetupPath method can be used. MSDN says the method returns the full local path for the specified subdirectory. It’s supposed, you pass a relative path of the subdirectory being located inside the SP installation directory. Getting exactly the SP installation directory path, just pass an empty string to the method.
... using Microsoft.SharePoint.Utilities; ... string spInstDirPath = SPUtility.GetGenericSetupPath(string.Empty);
In my case the above code sample returns C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14 for SharePoint 2010 and C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12 for SharePoint 2007. To get the path of the Features directory, use the following code snippet:
string spFeaturesDirPath = SPUtility.GetGenericSetupPath(@"template\features");
The GetGenericSetupPath method is accessible only if an application has reference to Microsoft.SharePoint.dll. Let’s assume we develop a SharePoint independent application. How can we get the SP installation directory path in this case? Having analyzed the GetGenericSetupPath method using .Net Reflector, I’ve disclosed that the directory path we are interested in is read from Windows Registry. The SharePoint independent method to get the SP installation directory path and an accompanying method are presented below:
using System; using System.IO; using Microsoft.Win32; ... public static T GetLocalMachineRegistryValue<T>(string path, string valueName, T defaultValue) { T res = defaultValue; try { using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path)) { if (key != null) { object valObj = key.GetValue(valueName); if (valObj is T) res = (T)valObj; } } } catch (Exception) { // write to log } return res; } public static string GetSPInstallationDirectoryPath() { const string keyVer2007 = @"SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0"; const string keyVer2010 = @"SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\14.0"; const string valueName = "Location"; string res = GetLocalMachineRegistryValue<string>(keyVer2010, valueName, null); if(res == null) res = GetLocalMachineRegistryValue<string>(keyVer2007, valueName, null); return res; }
The following method is dedicated to get the path of the Features directory:
public static string GetSPFeaturesDirectoryPath() { const string featuresDirPathPattern = @"template\features"; string res = null; string instDirPath = GetSPInstallationDirectoryPath(); if (instDirPath != null) res = Path.Combine(instDirPath, featuresDirPathPattern); return res; }
Here is how you can use these methods:
string spInstallationDir = GetSPInstallationDirectoryPath(); string spFeaturesDir = GetSPFeaturesDirectoryPath();
Please note, when accessing Registry on x64 Windows from a x32 application, you may stumble upon Registry Reflection and Registry Redirector. Please, take a look at the article to read from the right Registry Key.