title: Too Much Memory Usage for Windows form Application
body: <p>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 ?</p>
  
  <p>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</p>
  
  <pre><code>using (SPSite CurrentSite = new SPSite(tbSite.Text))
  </code></pre>
  
  <p>The memory usage goes from   20,000 K to 40,000 K   (approx)</p>
  
  <p>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 ,</p>
  
  <p><a href="http://blogs.microsoft.co.il/blogs/shair/archive/2011/10/27/sharepoint-api-download-upload-documents-tool.aspx" rel="nofollow">enter link description here</a></p>
  
  <pre><code>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 &lt; 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 &gt; 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 &amp;&amp; lvFiles.Columns.Count &gt; 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 &lt; 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 &amp;&amp; !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 &lt; 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 &gt; 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 != "" &amp;&amp; TreeFolder.Nodes.Count != 0)
              bFolder.Enabled = true;
          else
              bFolder.Enabled = false;
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>Already checked with SP Dispose checker but it says this (at MapWebs method line "node.tag = weblist[i]... and if statement")</p>
  
  <blockquote>
    <p>Notes: Call to Microsoft.SharePoint.SPWebCollection.get_Item and no variable to catch return value
    More Information: <a href="http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx#SPDisposeCheckID_130" rel="nofollow">http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx#SPDisposeCheckID_130</a></p>
  </blockquote>