> public static void Main() > { > StringBuilder loStringBuilder = new StringBuilder(); > > // this part outside the loop - even at class level if possible > > Uri uri = new Uri(lcURI); > NetworkCredential credentials = new System.Net.NetworkCredential(cUsername, cPassword); > > // FTP setup > var loFtpWebRequest = System.Net.FtpWebRequest.Create(uri); > loFtpWebRequest.Credentials = credentials; > loFtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails; > > // If we use FTP/SSL (AUTH SSL) > // If ( nNoFTPProtocol == 2) > // loFtpWebRequest.EnableSsl = true; > > > using( var toDispose = new DisposableCollection()) > { > var loFtpWebResponse = loFtpWebRequest.GetResponse(); > toDispose.Add(loFtpWebResponse); > > var s = loFtpWebResponse.GetResponseStream(); > toDispose.Add(s); > > var loStreamReader = new StreamReader(s); > toDispose.Add(loStreamReader); > loStringBuilder.Append(loStreamReader.ReadToEnd()); > > } > Console.WriteLine("{0}", loStringBuilder.ToString()); > Console.ReadLine(); > > } > > > > > public class DisposableCollection : IDisposable > { > > //______________________________________________________________________ > private Stack<IDisposable> ObjectStack = new Stack<IDisposable>(); > private bool Disposed = false; > //______________________________________________________________________ > public void Add(IDisposable obj) > { > if (Disposed) > throw new ObjectDisposedException("Already disposed"); > > if( obj != null ) > lock (ObjectStack) > ObjectStack.Push(obj); > > } > //______________________________________________________________________ > public void Dispose() > { > Dispose(true); > GC.SuppressFinalize(this); > } > //______________________________________________________________________ > protected virtual void Dispose(bool disposing) > { > if( !Disposed ) > { > Disposed = true; > > if (disposing) > { > if (ObjectStack != null) > { > lock (ObjectStack) > { > while (ObjectStack.Count > 0) > { > IDisposable obj = ObjectStack.Pop(); > //Console.WriteLine("Disposing {0}", obj); > obj.Dispose(); > } > } > ObjectStack = null; > } > } > > > > > // Release unmanaged resources > } > } > //______________________________________________________________________ > ~DisposableCollection() > { > Dispose(false); > } > //______________________________________________________________________ > } >Very neat !