Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7020881
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T23:22:35+00:00 2026-05-27T23:22:35+00:00

I Made an application to download a folder from a given sharepoint site, but

  • 0

I Made an application to download a folder from a given sharepoint site, but its consuming memory above 600,000K once i click on Connect button, anyone can give suggestion to improve my code ?

I Tried to debug my form and problem is coming at method ” private void MapWebs(SPWebCollection webList, TreeNode webparentNode)” where its calling itself again and again to go through each single web and its sub web, however I checked in the start when i click on connect and it goes through code line

using (SPSite CurrentSite = new SPSite(tbSite.Text))

The memory usage goes from 20,000 K to 40,000 K (approx)

In order to run this application you must have sharepoint installed on yur PC, an example of this type of app is on this link ,

enter link description here

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.SharePoint;
using System.IO;

namespace WindowsFormsApplication3
{
    public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    //Connects to Sharepoint site provided and populates Webs and Subwebs and subwebs....
    private void bConnect_Click(object sender, EventArgs e)
    {
            //Getting current site
            using (SPSite CurrentSite = new SPSite(tbSite.Text))
            {
                //Opening TopLevel Web for Site given
                using (SPWeb TopLevelWeb = CurrentSite.OpenWeb())
                {
                    //Clearing all the nodes in TreeWeb
                    TreeWeb.Nodes.Clear();
                    //Creating a root (First Node for webtree) which will be Top Level web's title
                    TreeNode rootWebNode = new TreeNode(TopLevelWeb.Title);
                    //Giving node a tag, which will be used later on in order to get value of node
                    rootWebNode.Tag = TopLevelWeb;
                    //Check if Top Level Web got any Sub webs if it does, it will create a new node for them
                    //Calls Map Webs to check for more sub webs + mapping them on webtree as nodes
                    foreach (SPWeb CurrentWeb in TopLevelWeb.Webs)
                    {
                        try
                        {
                            TreeNode webNode = new TreeNode(CurrentWeb.Title);
                            webNode.Tag = CurrentWeb;
                            MapWebs(CurrentWeb.Webs, webNode);
                            TreeWeb.Nodes.Add(webNode);
                        }
                        finally 
                        {
                            if (CurrentWeb != null)
                                CurrentWeb.Dispose();
                        }
                    }
                }
            }
        }

    // Maps Webs and there sub webs on webtree
    private void MapWebs(SPWebCollection webList, TreeNode webparentNode)
    {
            for (var i = 0; i < webList.Count; i++)
            {
                TreeNode node = new TreeNode(webList[i].Name);

                using (SPWeb web = webList[i])
                {
                node.Tag = webList[i];
                    webparentNode.Nodes.Add(node);
                    if (webList[i].Webs.Count > 0)
                        MapWebs(webList[i].Webs, node);
                }
            }
            GC.Collect();
    }

    //when the form loads it clears the list and create new cloumns to be used
    private void MainWindow_Load(object sender, EventArgs e)
    {
        bFolder.Enabled = false;
        bConnect.Enabled = false;
        lvFiles.GridLines = true;
        lvFiles.View = View.Details;
        lvFiles.Columns.Add("Name", lvFiles.Width/4, HorizontalAlignment.Left);
        lvFiles.Columns.Add("Date Created", lvFiles.Width/3, HorizontalAlignment.Left);
        lvFiles.Columns.Add("Size", lvFiles.Width / 5, HorizontalAlignment.Left);
        lvFiles.Columns.Add("Time Last Modified", lvFiles.Width / 5, HorizontalAlignment.Left);
        if (lvFiles.View == View.Details && lvFiles.Columns.Count > 0)
            this.Width = lvFiles.Columns.Count * (lvFiles.Width / 2);
        lvFiles.Columns[lvFiles.Columns.Count - 1].Width = -2;
    }

    //creates directory for downloading folder
    private bool CreateDirectoryStructure(string baseFolder, string filepath)
    {
        if (!Directory.Exists(baseFolder)) return false;

        var paths = filepath.Split('/');

        for (var i = 0; i < paths.Length - 1; i++)
        {
            baseFolder = System.IO.Path.Combine(baseFolder, paths[i]);
            Directory.CreateDirectory(baseFolder);
        }
        return true;
    }

    //opens an dialog box for selecting path where selected folder will be downloaded
    private void bBrowse_Click(object sender, EventArgs e)
    {
        if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            this.tbDirectory.Text = folderBrowserDialog1.SelectedPath;
        }
    }

    //when a node is selected in webtree it checks for folders in it , + sub folders + folders......
    private void TreeWeb_AfterSelect(object sender, TreeViewEventArgs e)
    {
        TreeFolder.Nodes.Clear();
        TreeNode currentNode = TreeWeb.SelectedNode;
        using (SPWeb oWeb = (SPWeb)currentNode.Tag)
        {
            foreach (SPList list in oWeb.Lists)
            {
                if (list is SPDocumentLibrary && !list.Hidden)
                {
                    TreeNode folderNode = new TreeNode(list.Title);
                    folderNode.Text = string.Format("{0} ({1})", list.Title, list.ItemCount);
                    folderNode.Tag = list.RootFolder;

                    foreach (SPListItem listItem in list.Folders)
                    {
                        if (listItem.Folder != null)
                        {
                            TreeNode node = new TreeNode(listItem.Folder.Name);
                            node.Tag = listItem.Folder;
                            node.Text = string.Format("{0} ({1})", listItem.Folder.Name,
                                                 GetFilesCount(listItem.Folder));

                            MapFolders(listItem.Folder.SubFolders, node);
                            folderNode.Nodes.Add(node);
                        }
                    }

                    TreeFolder.Nodes.Add(folderNode);
                }
            }
        }
    }

    //Maps folder on foldertree
    private void MapFolders(SPFolderCollection folderList, TreeNode parentNode)
    {
        for (var i = 0; i < folderList.Count; i++)
        {
                TreeNode node = new TreeNode(folderList[i].Name);
                node.Text = string.Format("{0} ({1})", folderList[i].Name,
                                             GetFilesCount(folderList[i]));
                node.Tag = folderList[i];
                parentNode.Nodes.Add(node);

                if (folderList[i].SubFolders.Count > 0)
                    MapFolders(folderList[i].SubFolders, node);
        }
    }

    //Maps files in a folder to listview
    private void TreeFolder_AfterSelect(object sender, TreeViewEventArgs e)
    {
        lvFiles.Items.Clear();
        TreeNode currentNode = TreeFolder.SelectedNode;
        //if (currentNode != rotnode)
        //{
        double TotalSize = 0;
        SPFolder oFolder = (SPFolder)currentNode.Tag;
        foreach (SPFile oFile in oFolder.Files)
            {
                TotalSize += (oFile.Length)/1024/1024;

                ListViewItem LTI = new ListViewItem(oFile.Name.ToString());
                LTI.SubItems.Add(oFile.TimeCreated.ToString());
                LTI.SubItems.Add(oFile.Length.ToString());
                LTI.SubItems.Add(oFile.TimeLastModified.ToString());
                lvFiles.Items.Add(LTI);
            }
            label4.Text = TotalSize.ToString();
        //}
    }

    //download selected folder + validation
    private void bFolder_Click(object sender, EventArgs e)
    {
            TreeNode currentNode = TreeFolder.SelectedNode;
                SPFolder oFolder = (SPFolder)currentNode.Tag;
                foreach (SPFile file in oFolder.Files)
                {
                    if (CreateDirectoryStructure(tbDirectory.Text, file.Url))
                    {
                        var filepath = System.IO.Path.Combine(tbDirectory.Text, file.Url);
                        byte[] binFile = file.OpenBinary();
                        System.IO.FileStream fstream = System.IO.File.Create(filepath);
                        fstream.Write(binFile, 0, binFile.Length);
                        fstream.Close();
                    }
                }
    }

    //calculates files in selected folder
    private int GetFilesCount(SPFolder folder)
    {
        int fileCount = folder.Files.Count;
        foreach (SPFolder subfolder in folder.SubFolders)
        {
            fileCount += GetFilesCount(subfolder);
        }
        return fileCount;
    }

    //validation
    private void tbSite_TextChanged(object sender, EventArgs e)
    {
        if (tbSite.Text != "")
            bConnect.Enabled = true;
        else
            bConnect.Enabled = false;
    }

    //validation
    private void tbDirectory_TextChanged(object sender, EventArgs e)
    {
        if (tbDirectory.Text != "" && TreeFolder.Nodes.Count != 0)
            bFolder.Enabled = true;
        else
            bFolder.Enabled = false;
    }
}

}

Already checked with SP Dispose checker but it says this (at MapWebs method line “node.tag = weblist[i]… and if statement”)

Notes: Call to Microsoft.SharePoint.SPWebCollection.get_Item and no variable to catch return value
More Information: http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx#SPDisposeCheckID_130

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T23:22:35+00:00Added an answer on May 27, 2026 at 11:22 pm

    I see two issues here:

    1. You are disposing the SPWeb while iterating over the SPWeb.Webs, but you keep a reference on the TreeNode.Tag. When accessing the disposed SPWeb via the tag of the node SharePoint will “open” the web again. => Memory Leak

    2. Since you are calling the MapWebs method recursive you have a lot of SPWeb objects opened simultaneously:

      Root -> open
        Child 1 -> open
          Child 1.1 -> open
              Child 1.1.1 -> open
          Child 1.2
          Child 1.3
          Child 1.4
      Child 2
      Child 3
      
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have made an application using Java/Hibernate/MySQL, but whenever I try running it, it
I have made an application and I have installed it on my iphone, but
I'm building a fairly large enterprise application made in python that on its first
I've made an application that takes tagged versions of a project from an hg
I made code that download APK from ftp, and I`m trying to install it
I made an application which download lots of data and I want to add
My Application does not allow Interop.CDO to download a file from FTP server, what
Hi Now I am download Image view source Its working fine....but if I change
I have successfully made an application but whenever I try installing it in the
I made a windows form application which maps whole of spsite (given in text

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.