Tuesday, July 12, 2011

Undo "Add To Reject List" in Samsung Mobile

Navigate to following menu options to Add/Edit/Delete any number from reject list:

Settings > Application settings > Call > All calls > Auto reject > Reject list

Here you can find the Reject list.
You can Add/Edit/Delete number which you want to maintain in Reject List.

Reference: Samsung Forum

Monday, July 11, 2011

Creating Custom Field in SharePoint 2010

In this post basically I tried to answer following questions:
A. What is Custom Field in SharePoint?
B. What are the steps to implement Custom Field in SharePoint?
C. How to override Save button while creating New Item in SharePoint's List?
D. How to consume Custom Field?


I explained the above questions with following scenario:
1. Created a column based on custom field.
2. Override the Save button of New Item page.
3. In Save button click, beside performing normal operation, I am setting the another column value with concated value of custom field column and current TimeStamp.


A. What is Custom Field in SharePoint?
=============================================
Exceprt from MSDN site-
Although site columns provide users and developers with new capabilities in reuse, you can define a reusable column definition that is even more powerful. With Microsoft SharePoint Foundation 2010, you can drop down to a lower level by creating custom field types.
Reference: Creating Custom SharePoint 2010 Field Types


Exceprt from Chak's blog-
In SharePoint, a site column is a reusable column definition, or template, that you can assign to multiple lists across multiple SharePoint sites. Site columns are associated to a particular Data Type. This Data Type is called a Field. For example, when you create a site column, you are also prompted to select the type of information, which is nothing but a Data Type or a Field.

Sometimes, it is necessary for us to create our own custom field that does not conform to the field types included in SharePoint by default.

All you have to do is – create a custom field which would result in creating a Field Class, Field Control and Field Type Definitions.
1. The Field Class should inherit from any of the SPField classes.
2. The Field Control should have Field Rendering Control and a Field Rendering Template.
3. The Field Type Definitions is a XML file which contains some information about the custom field.


Reference: SharePoint: Creating a custom field




B. What are the steps to implement Custom Field in SharePoint?
=====================================================================

Following Components/Files are required for creating Custom Field:

1. Add Assembly reference of PresentationFramework
2. UserControl/ASCX in SharePoint Mapped CONTROLTEMPLATES folder of 14 hive
3. XML in SharePoint Mapped XML folder of 14 hive
4. XSL in SharePoint Mapped XSL folder of 14 hive [Optional]
5. C# class for CustomField
6. C# class for CustomFieldControl
7. C# class for CustomFieldValidationRule [Optional]



1. Steps to Add PresentationFramework reference:
=======================================================

Solution Explorer > Project > References > .Net tab > Select PresentationFramework


2. Steps to add UserControl:
==================================

a. Add CONTROLTEMPLATES Mapped Folder:

Solution Explorer > Project > Right-Click > Add > SharePoint Mapped Folder...

Select desired folder in opened pop-up window.


b. Add UserControl in Project:



UserControl File:

Installed Templated > Visual C# > SharePoint > 2010 > User Control [Middle Pane] > Enter desired name


Code snippet for User Control [e.g. AviCustomNameField.ascx]:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" 
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" 
Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, 
PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" 
Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, 
PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %> 
<%@ Register Tagprefix="WebPartPages" 
Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, 
Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" %>
<SharePoint:RenderingTemplate ID="AviCustomNameFieldControl" runat="server">
    <Template>
        <table>
            <tr>
                <td>
                    <asp:TextBox ID="MyCustomNameText" runat="server" 
                                    Width="385px" />
                </td>
            </tr>
        </table>
    </Template>
</SharePoint:RenderingTemplate>
<SharePoint:RenderingTemplate ID="AviCustomNameFieldControlForDisplay" 
                                 runat="server">
    <Template>
        <table>
            <tr>
                <td>
                    <asp:Label ID="MyCustomNameLabel" runat="server" 
                                  Width="385px" />
                </td>
            </tr>
        </table>
    </Template>
</SharePoint:RenderingTemplate>




3. Steps to add XML in SharePoint Mapped XML folder of 14 hive:
==================================================================
a. Add SharePoint Mapped Folder for XML [as mentioned in earlier steps]
b. Add new XML file [as mentioned in earlier steps]
c. Code snippet for XML [e.g. fldtypes_AviCustomNameField.xml]

<?xml version="1.0" encoding="utf-8" ?>
<FieldTypes>
  <FieldType>
    <Field Name="TypeName">AviCustomNameField</Field>
    <Field Name="ParentType">Text</Field>
    <Field Name="TypeDisplayName">Avi Custom Name Field</Field>
    <Field Name="TypeShortDescription">Avi Custom Name Field</Field>
    <Field Name="UserCreatable">TRUE</Field>
    <Field Name="ShowOnListCreate">TRUE</Field>
    <Field Name="ShowOnSurveyCreate">TRUE</Field>
    <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
    <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
    <Field Name="FieldTypeClass">Avi.AviCustomNameField,$SharePoint.Project.AssemblyFullName$</Field>
  </FieldType>
</FieldTypes>


Note: Prefix the file name(s) for XML/XSL file as fldtypes_


4. Steps to add XSL in SharePoint Mapped XSL folder of 14 hive:
==================================================================
a. Add SharePoint Mapped Folder for XSL [as mentioned in earlier steps]
b. Add new XSL file [as mentioned in earlier steps]
c. Code snippet for XSL [e.g. fldtypes_AviCustomNameField.xsl]

<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
                version="1.0"
                exclude-result-prefixes="xsl msxsl ddwrt"
                xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
                xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                xmlns:ddwrt2="urn:frontpage:internal">
  <xsl:template match="FieldRef[@Name = 'AviCustomNameField']" mode="Text_body">
    <xsl:param name="thisNode" select="." />
    <span style="background-color:lightgreen;font-weight:bold">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" />
    </span>
  </xsl:template >
</xsl:stylesheet>


Note: Prefix the file name(s) for XML/XSL file as fldtypes_


5. Steps to add C# class for CustomField:
================================================
a. Add new C# file as per following figure:


Installed Templated > Visual C# > Class [Middle Pane] > Enter desired name

b. Code snippet for CustomField [e.g. AviCustomNameField.cs]

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Security;
using System.Windows.Controls;
using System.Globalization;
using System.Security.Permissions;

namespace Avi
{
    class AviCustomNameField : SPFieldText
    {
        public AviCustomNameField(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
        {
        }

        public AviCustomNameField(SPFieldCollection fields, string typeName, 
                                  string displayName)
            : base(fields, typeName, displayName)
        {
        }

        public override BaseFieldControl FieldRenderingControl
        {
            [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
            get
            {
                BaseFieldControl fieldControl = new AviCustomNameFieldControl();
                fieldControl.FieldName = this.InternalName;
                return fieldControl;
            }
        }

        public override string GetValidatedString(object value)
        {
            if ((this.Required == true) && ((value == null) 
               || ((String)value == "")))
            {
                throw new SPFieldValidationException(this.Title + 
                          " must have a value.");
            }
            else
            {
                AviCustomNameFieldValidationRule rule 
                   = new AviCustomNameFieldValidationRule();
                ValidationResult result 
                   = rule.Validate(value, CultureInfo.InvariantCulture);
                if (!result.IsValid)
                {
                    throw new
                          SPFieldValidationException((String)result.ErrorContent);
                }
                else
                {
                    return base.GetValidatedString(value);
                }
            }
        }
    }
}


6. Steps to add C# class for CustomFieldControl:
================================================
a. Add new C# file [as mentioned in earlier steps]
b. Code snippet for CustomFieldControl [e.g. AviCustomNameFieldControl.cs]

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.IO;
using System.Collections;

namespace Avi
{
    class AviCustomNameFieldControl : BaseFieldControl
    {
        protected TextBox MyCustomNameText;
        protected Label MyCustomNameLabel;

        protected override string DefaultTemplateName
        {
            get
            {
                if (this.ControlMode == SPControlMode.Display)
                {
                    return this.DisplayTemplateName;
                }
                else
                {
                    return "AviCustomNameFieldControl";
                }
            }
        }

        public override string DisplayTemplateName
        {
            get
            {
                return "AviCustomNameFieldControlForDisplay";
            }
            set
            {
                base.DisplayTemplateName = value;
            }
        }

        protected override void CreateChildControls()
        {

            base.CreateChildControls();

            this.MyCustomNameText = 
               (TextBox)TemplateContainer.FindControl("MyCustomNameText");
            this.MyCustomNameLabel =
               (Label)TemplateContainer.FindControl("MyCustomNameLabel");


            if (this.ControlMode != SPControlMode.Display)
            {
                if (!this.Page.IsPostBack)
                {
                    if (this.ControlMode == SPControlMode.New)
                    {

                    }
                }
            }
            else
            {
                if (this.MyCustomNameLabel != null)
                {
                    MyCustomNameLabel.Text = (String)this.ItemFieldValue;
                    //this.MyCustomNameLabel.Text =
                      SPContext.Current.ListItem["MyName"].ToString();
                }
            }
        }

        public override object Value
        {
            get
            {
                EnsureChildControls();
                return base.Value;
            }
            set
            {
                EnsureChildControls();
                base.Value = (String)value;
            }
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // add save handler only in New and Edit modes
            if ((SPContext.Current.FormContext.FormMode == SPControlMode.New)
                || (SPContext.Current.FormContext.FormMode == SPControlMode.Edit))
            {
                SPContext.Current.FormContext.OnSaveHandler
                    += new EventHandler(MyCustomSaveHandler);
            }
        }

        protected void MyCustomSaveHandler(object sender, EventArgs e)
        {
            Page.Validate();
            if (Page.IsValid)
            {
                SPContext.Current.ListItem["SampleNameWithTimeStamp"]
                    = MyCustomNameText.Text
                    + " - " + DateTime.Today.ToShortDateString();

                SPContext.Current.ListItem["MyName"] = MyCustomNameText.Text;
                
                SPContext.Current.ListItem.Update();
            }
            else
            {
                // do actions instead of save
            }
        }

    }
}



7. Steps to add C# class for CustomFieldValidationRule:
================================================
a. Add new C# file [as mentioned in earlier steps]
b. Code snippet for CustomFieldValidationRule[e.g. AviCustomNameFieldValidationRule.cs]

using System;
using System.Windows.Controls;
using System.Globalization;

namespace Avi
{
    public class AviCustomNameFieldValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, 
                                                  CultureInfo cultureInfo)
        {
            String CustomName = (String)value;
            bool result = isValidCustomName(CustomName);
            if (result != true)
            {
                return new ValidationResult(false, "Enter valid Name.");
            }
            else
            {
                return new ValidationResult(true, "Name Entered is correct.");
            }
        }
        public static bool isValidCustomName(string CustomName)
        {
            //Logic to validate data
            return true;
        }
    }
}




C. How to override Save button while creating New Item in SharePoint's List?
===================================================================================
a. Register custom method to Save button click in OnInit page event
Excerpt code snippet:
protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            // add save handler only in New and Edit modes
            if ((SPContext.Current.FormContext.FormMode == SPControlMode.New)
                || (SPContext.Current.FormContext.FormMode == SPControlMode.Edit))
            {
                SPContext.Current.FormContext.OnSaveHandler
                    += new EventHandler(MyCustomSaveHandler);
            }
        }

b. Implement custom method [e.g. MyCustomSaveHandler]
Excerpt code snippet:
protected void MyCustomSaveHandler(object sender, EventArgs e)
        {
            Page.Validate();
            if (Page.IsValid)
            {
                // do actions in case of save
            }
            else
            {
                // do actions instead of save
            }
        }

Note: For complete code refer AviCustomNameFieldControl.cs class [mentioned earlier].



After adding all the mentioned files, this will be Final View of Solution/Project Explorer:



Miscellaneous:
Steps to change Assembly name and Default namespace:
===========================================================
Solution Explorer > Project > Right-Click > Properties > Change Assembly name and Default namespace as per requirement


D. How to consume Custom Field?
======================================
1. Create a Custom List

2. Create a new column and choose already created custom field [as per following figure]:

3. Following would be list structure without any data:

4. Add a new item to List:

5. List with data:


References:
==================
Creating a Custom Field Type for SharePoint 2010 (Email Validation Field)

How to override the default item save event using custom fields

Tuesday, June 28, 2011

Configure Microsoft Office Outlook 2010 Profile


* Open Microsoft Office Outlook Web Access

* Click User Control Panel

* Enter Credentials


* Go to – Downloads

* Download Your Outlook Profile

* Save it in Hard-disk [in my case I saved it in C drive with following name C:\filename.prf].



* Open Window's Run and run following command (Windows > Start > Run) :
outlook.exe /importprf C:\filename.prf

Reference :
customizing-outlook-profiles

Wednesday, March 23, 2011

JavaScript in Elements.xml file of a SharePoint Feature

Here my requirement was to create a menu/link in SharePoint's SiteActions, on click of which it redirects to custom site page created under Pages folder [/Pages/MyPage.aspx].

Challenges:
1. To execute JavaScript code on menu/link click.
2. Build the absolute URL of custom page.

Solution:
1. First create a SharePoint Feature to add a new menu/link in SiteActions.
2. Modify the Elements.xml using CustomAction/URLAction to execute the JavaScript code.
3. Write the required JavaScript code as per requirement [I have written a small piece of code to fetch the current server name and then build the absolute URL of custom page].
4. Install and Activate the SPFeature.



Following is the code snippet of Elements.xml file :

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
                <CustomAction
                                GroupId = "SiteActions"
                                Location="Microsoft.SharePoint.StandardMenu"
                                Sequence="1000"
                                RequireSiteAdministrator="TRUE"
                                Title="My Links">
                                <UrlAction Url="javascript:function process()
                                { 
                                 var site='{SiteUrl}'; 
                                 var pageurl = ''; 
                                 var serverName = ''; 
                                 var endindex = site.indexOf('/', '10'); 
                                 if(endindex == -1) { serverName = site; } 
                                 else { serverName = site.substring(0, endindex); } 
                                 pageurl = serverName + '/Pages/MyPage.aspx'; 
                                 window.location = pageurl;         
                                }; 

                                process();"/>
                </CustomAction>
</Elements>

Friday, January 21, 2011

SharePoint 2010 Tips and Tricks

1. Change Site Icon/Logo of all pages in SharePoint 2010 (Wiki pages and Web part pages)

a. Wiki Pages:

Navigate to following path-
Site > Site Actions > Site Settings > Look and Feel > Title, description, and icon > URL

In URL textbox we can specify either Site Asset’s Image or 14 hive image.
Reference:
Change Wiki Page Site Logo

b. Web Part Pages:

  • Open Web Part page
  • Select Page ribbon Tab on top
  • Select Title Bar Properties
  • Scroll to the right and on the Web Part Page Title Bar properties
  • Specify either Site Asset’s Image or 14 hive image

Reference:
Change Web Part Page Site Logo



2. Enable Anonymous in SharePoint 2010


  1. Open SharePoint 2010 Central Administration
  2. Navigate to following path:
    Central Administration > Application Management > Manage web applications
  3. Select desired Web Application
  4. Click Authentication Providers icon in ribbon tab
  5. On the Authentication Providers pop-up window click on the Default zone.
  6. Under Edit Authentication, check Enable anonymous access and click Save.
  7. Go back to Web Application Management click on the Anonymous Policy icon in ribbon tab.
  8. Under Anonymous Access Restrictions select your Zone and set the Permissions to None – No policy and click Save.
  9. Now, open the desired web application in which we want to set anonymous access.
  10. Navigate to your top level site collection for the web application.
  11. Click the Site Actions > Site Settings > Users and Permissions > Site permissions.
  12. Under Permission Tools ribbon, click Anonymous Access icon
  13. Set the permissions to Entire Web site, or List and Libraries, or Nothing as per requirement
  14. Click OK.
  15. In case of Anonymous access at Web site level:
  • Navigate to Web Site > Site Actions > Site Permissions
  • Click Stop Inheriting Permissions icon in Permission Tools ribbon tab
  • After that we can see Anonymous Access icon in ribbon, click it
  • In Anonymous Access pop-up select desired check box as per requirement
  • Click Ok
        In case of Anonymous access at List and Library level:
  • Navigate to List or Library > List Tool tab > List tab > List Settings icon in ribbon > Permissions and Management > Permissions for this list
  • Click Stop Inheriting Permissions icon in Permission Tools ribbon tab
  • After that we can see Anonymous Access icon in ribbon, click it
  • In Anonymous Access pop-up select desired check box as per requirement
  • Click Ok

Reference:
Enable Anonymous Access 1
Enable Anonymous Access 1


3. Steps to use or consume SharePoint List or Libraries RSS functionality

  • If we are planning to use out-of-box RSS functionality of SharePoint’s List or Libraries using out-of-box RSS Viewer web part of SharePoint, then we have to enable Anonymous access at List or Library level.
  • If anonymous access is disabled at List or Library level then we will get following error:
    “The RSS webpart does not support authenticated feeds”

To solve the above error there are following options:

  • Set anonymous access at List or Library level
  • Use 3rd party RSS Feed Reader [available in Codeplex site]
  • Set IIS Authentication from NTLM to Kerberos
    [Central Administration > Application Management > Manage web applications > Select desired Web application > Select Authentication Providers icon in ribbon tab > Click Default link in Authentication Providers pop-up > Edit Authentication pop-up > IIS Authentication Settings > Integrated Windows Authentication > Select Negotiate (Kerberos)]


Note: As per me first option i.e. set anonymous access is best one.


4. Master page branding or UI change in SharePoint 2010

[Note: It’s was my personal experience]
I tried to change the HTML code of default.master or V4.master page/file using SharePoint 2010 Designer (SPD).
SPD reflected all changes, but when I browsed any content page, it didn’t displayed the desired changes.

Solution [as per me]:
I created a copy of default.master or V4.master and renamed it as per requirement. Made all the required HTML changes in it and saved it. Right clicked on the new custom master page and selected the Set as Default Master Page option. Changes get reflected in both SPD and all the browsed content pages.


5. How to hide first tab of SharePoint 2010 site

We need to add following CSS class to hide first tab of SharePoint 2010 site:

.s4-tn li.static:first-child{ 
display: none; 
}


Why we need to hide the first tab???
Ans: There is well known tab selection issue in SharePoint 2010. When we select first tab, second tab always remain selected (wrong tab selection as per UI). To solve this issue, I made the first tab invisible and made the second tab as home page tab. So by this when user clicks the first visible tab, he actually clicks the second tab and hence there is no UI confusion regarding tab selection.



6. Error :
Error occurred in deployment step 'Retract Solution': A deployment or retraction is already under way for the solution "MySolution.wsp", and only one deployment or retraction at a time is supported.

Solution:
a. Enumerates all pending and active deployments in the farm using following command:
stsadm -o enumdeployments

b. Cancel the troublesome Solution that was causing problem [specify the Solution GUID using above command]:
stsadm -o canceldeployment -id <solution GUID>


Reference:
SharePoint deployment or retraction issue



Friday, October 22, 2010

Display SharePoint ListItem's Attachments

Steps to create a separate page to display all the attachments of a particular SPListItem using SharePoint Designer:

1. Create an ASPX page using SharePoint Designer (SPD).



2. Add a DataView control in page in-between HTML form tag.
Note: First save the page then add control.



3. Select the Data Source Library.
Select your SharePoint List (in my case it is MyTest SPList). Open its context menu and select Show Data


4. Select columns you want to keep in Data Source Details.



5. Insert Selected Fields as Single Item View



6. Now some code changes:
a. Add some CSS style above closing head tag [optional]
<style type="text/css">
.ms-vb a
{
    font-family:Verdana;
    font-size:x-small;
}
</style>
</head>

b. Place your selected columns/fields
Location followig code snippet:
<xsl:template name="dvt_1.rowview">
<tr>

and insert following code in-between them:

<xsl:template name="dvt_1.rowview">[Original code - 1]
<tr style="color:maroon;font-weight:bold; font-family:Tahoma; font-size:small;">
    <td>
        Attachments                       
    </td>
</tr>
<tr class="ms-alternating" style="font-family:Tahoma; font-size:x-small;">
    <td>
        SharePoint ListItem ID - <b><SharePoint:FieldValue FieldName="ID" ControlMode="Display" runat="server" Visible="true" /></b>
    </td>
</tr>             
<tr class="ms-formbody" style="font-family:Tahoma; font-size:xx-small;">
    <td>
        <SharePoint:AttachmentsField ControlMode="Display" FieldName="Attachments" runat="server" Visible="true"/>
    </td>
</tr>
<tr style="display:none;">[Original code - 2]

Note-Here we are hiding the existing TR row


c. Hide paging control
Locate following code snippet:

<td nowrap="" class="ms-paging" align="right">

and hide that TD.
changed snippet:

<td style="display:none;" nowrap="" class="ms-paging" align="right"> 


7. Now open the page in browser and passed SPListItem as query string.
example: http://[server-name]:[port-number]/[page-name].aspx?ID=1


Tuesday, September 14, 2010

Code to search files with particular extension in SharePoint's Web Application

Requirement:
To search files with particular extension [here *.doc as example].

Here to achieve the above requirement I used SharePoint's Object Model.

I downloaded those searched files to a particular folder.
Beside printing the searched files result in console and I am also logging it in a Log file.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.IO;
using System.Collections;

namespace SearchFile
{
    class Program
    {
        static void Main(string[] args)
        {
            //Get folder path
            string directoryPath
                = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
                , "MyFolder");

            //Create directory if it not exist
            if (!(Directory.Exists(directoryPath)))
                Directory.CreateDirectory(directoryPath);

            //SPFile myFile = null;
            byte[] binFile;
            string filename = string.Empty;
            FileStream fs = null;
            BinaryWriter bw = null;
            SPDocumentLibrary library = null;
            string fileExtension = ".doc";
            string siteURL = "http://[server-name]:[port-number]";
            StringBuilder filesLog = new StringBuilder();

            using (SPSite site = new SPSite(siteURL))
            {
                foreach (SPWeb web in site.AllWebs)
                {
                    foreach (SPList list in web.Lists)
                    {
                        if (list.BaseType == SPBaseType.DocumentLibrary)
                        {
                            library = (SPDocumentLibrary)list;
                            SPFolder folder = library.RootFolder;
                            ArrayList foldersList = new ArrayList();
                            foldersList.Add(folder);

                            foldersList = getFolders(folder, foldersList);

                            //foreach (SPListItem oListItem in library.Items)
                            foreach (SPFolder fold in foldersList)
                            {
                                foreach (SPFile myFile in fold.Files)
                                {
                                    //Download file in file system
                                    //myFile = oListItem.File;
                                    if (myFile.Name.EndsWith(fileExtension,
                                        StringComparison.InvariantCultureIgnoreCase))
                                    {
                                        binFile = myFile.OpenBinary();

                                        //Generate file name
                                        //filename = Path.Combine(directoryPath, myFile.Name);
                                        filename 
                                           = Path.Combine(directoryPath, 
                                                          myFile.Url.Replace("/", "_"));

                                        //Do file write operation
                                        fs 
                                          = new FileStream(filename, 
                                                FileMode.Create, FileAccess.ReadWrite);
                                        bw = new BinaryWriter(fs);
                                        bw.Write(binFile);
                                        bw.Close();

                                        filesLog.Append(string.Concat(web.Url, "/", 
                                                        myFile.Url, ","));
                                        Console.WriteLine(string.Concat(web.Url, "/",
                                                        myFile.Url));

                                    }//End file extension check 
                                }//End All SPFiles
                            }//End All SPFolders
                        }//End check DocumentLibrary
                    }//End All Lists
                }//End AllWebs
            }//End SPSite

            string[] lines = filesLog.ToString().Split(new char[] { ',' });
            System.IO.File.WriteAllLines(directoryPath + "/LOG_List.txt", lines);

            Console.WriteLine("Press any key to Exit...");
            Console.ReadLine();
        }

        //Recursive function to get all nested SPFolders
        static ArrayList getFolders(SPFolder folder, ArrayList foldersList)
        {
            foreach (SPFolder subfolder in folder.SubFolders)
            {
                foldersList.Add(subfolder);
                foldersList = getFolders(subfolder, foldersList);
            }
            return foldersList;
        }
    }
}


Google