File Stream C#

#region License and Copyright
/* -------------------------------------------------------------------------
 * Dotnet Commons IO
 *
 *
 * This library is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU Lesser General Public License as published by 
 * the Free Software Foundation; either version 2.1 of the License, or 
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
 * for more details. 
 *
 * You should have received a copy of the GNU Lesser General Public License 
 * along with this library; if not, write to the 
 * 
 * Free Software Foundation, Inc., 
 * 59 Temple Place, 
 * Suite 330, 
 * Boston, 
 * MA 02111-1307 
 * USA 
 * 
 * -------------------------------------------------------------------------
 */
#endregion
using System;
using System.Collections;
using System.Globalization;
using System.IO;
namespace Dotnet.Commons.IO
{
    class MainClass{
        /// --------------------------------------------------------------------------
        /// 
        ///  Copy file from source to destination. The directories up to 
        ///  destination will be created if they don't already exist. 
        /// 
        
        /// 
        /// 
        /// --------------------------------------------------------------------------
        public static void CopyFile(string source, string destination)
        {
            FileInfo sourceFile = new FileInfo(source);            
            FileInfo destFile = new FileInfo(destination);
            CopyFile(sourceFile, destFile);
        }
    /// --------------------------------------------------------------------------
    /// 
    ///  Copy file from source to destination. The directories up to 
    ///  destination will be created if they don't already exist. 
    ///  destination will be overwritten if it already exists.
    ///  The copy will have the same file date as the original.
    /// 

    /// An existing non-directory  to copy
    /// A non-directory  to write bytes to
    /// 
    /// 
    /// Ported from Jakarta Commons IO FileUtils
    /// --------------------------------------------------------------------------
    public static void CopyFile(FileInfo source, 
                                    FileInfo destination)
    {
      CopyFile(source, destination, true, true);
    }
    /// --------------------------------------------------------------------------
    /// 
    ///  Copy file from source to destination. The directories up to 
    ///  destination will be created if they don't already exist. 
    /// 

    /// An existing non-directory  to copy
    /// A non-directory  to write bytes to
    /// flag to indicate if the file date of 
        /// the copy should be the same as the original.
    /// Flag to indicate if the file 
        /// is to be overwritten if already exists
    /// 
    /// 
    /// Ported from Jakarta Commons IO FileUtils
    /// --------------------------------------------------------------------------
    public static void CopyFile(FileInfo source, 
                                    FileInfo destination, 
                                    bool preserveFileDate, 
                                    bool overwriteIfExists)
    {
      
      //check source exists
      if (!source.Exists) 
      {
        string message = "File '" + source.FullName + "' does not exist";
        throw new FileNotFoundException(message);
      }
      
      //does destinations directory exist ?
      if (destination.Directory != null && !destination.Directory.Exists) 
      {
        destination.Directory.Create();
      }
      //make sure we can write to destination
      if (destination.Exists && (destination.Attributes & FileAttributes.ReadOnly)== FileAttributes.ReadOnly) 
      {
        String message = "Unable to open file '" + destination.FullName + "' for writing.";
        throw new IOException(message);
      }
      //makes sure it is not the same file        
      if (source.DirectoryName.Equals(destination.DirectoryName)) 
      {
        String message = "Unable to write file '" + source + "' on itself.";
        throw new IOException(message);
      }
      
      
      File.Copy(source.FullName, destination.FullName, overwriteIfExists);          
      destination.Refresh();
      
      if (source.Length != destination.Length) 
      {
        String message =
          "Failed to copy full contents from "
          + source.FullName
          + " to "
          + destination.FullName;
        throw new IOException(message);
      }
        
      if (preserveFileDate) 
      {
        //file copy should preserve file date
        destination.LastWriteTime = source.LastWriteTime;        
      }
    }
        /// 
        /// Copy all the files in a directory into a destination folder. This operation performs
        /// a deep copy, meaning it copies all the files in the subdirectory inside the source directory.
        /// 

        /// source directory to copy from
        /// destination to copy to
        /// If the source directory does not exist
        /// if an I/O error occurs while copying the files
        public static void CopyFiles(string sourcePath,
                                     string destinationPath)
        {
            CopyFiles(new DirectoryInfo(sourcePath), new DirectoryInfo(destinationPath));
        }
        /// 
        /// Copy all the files in a directory into a destination folder. This operation performs
        /// a deep copy, meaning it copies all the files in the subdirectory inside the source directory.
        /// 

        /// source directory to copy from
        /// destination to copy to
        /// If the source directory does not exist
        /// if an I/O error occurs while copying the files
        public static void CopyFiles(DirectoryInfo source,
                                    DirectoryInfo destination)
        {
            if (!source.Exists)
                throw new ArgumentException(string.Format("Source directory '{0}' does not exist", source));
            if (!destination.Exists)
                destination.Create();
            FileInfo[] sourceFiles = source.GetFiles();
            foreach (FileInfo file in sourceFiles)
            {
                file.CopyTo(destination.FullName + Path.DirectorySeparatorChar + file.Name);
            }
            DirectoryInfo[] subdirs = source.GetDirectories();
            foreach (DirectoryInfo subdir in subdirs)
            {
                DirectoryInfo destSubDir = Directory.CreateDirectory(destination.FullName + Path.DirectorySeparatorChar + subdir.Name);
                CopyFiles(subdir, destSubDir);
            }
        }
   }
}