Copy file from source to destination
#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{ /// -------------------------------------------------------------------------- /// <summary> /// Copy file from source to destination. The directories up to /// <i>destination</i> will be created if they don't already exist. /// </summary> /// <param name="source"></param> /// <param name="destination"></param> /// -------------------------------------------------------------------------- public static void CopyFile(string source, string destination) { FileInfo sourceFile = new FileInfo(source); FileInfo destFile = new FileInfo(destination); CopyFile(sourceFile, destFile); } /// -------------------------------------------------------------------------- /// <summary> /// Copy file from source to destination. The directories up to /// <i>destination</i> will be created if they don't already exist. /// <i>destination</i> will be overwritten if it already exists. /// The copy will have the same file date as the original. /// </summary> /// <param name="source">An existing non-directory <see cref="FileInfo"/> to copy</param> /// <param name="destination">A non-directory <see cref="FileInfo"/> to write bytes to</param> /// <exception cref="IOException"/> /// <exception cref="FileNotFoundException"/> /// <remarks>Ported from Jakarta Commons IO FileUtils</remarks> /// -------------------------------------------------------------------------- public static void CopyFile(FileInfo source, FileInfo destination) { CopyFile(source, destination, true, true); } /// -------------------------------------------------------------------------- /// <summary> /// Copy file from source to destination. The directories up to /// <i>destination</i> will be created if they don't already exist. /// </summary> /// <param name="source">An existing non-directory <see cref="FileInfo"/> to copy</param> /// <param name="destination">A non-directory <see cref="FileInfo"/> to write bytes to</param> /// <param name="preserveFileDate">flag to indicate if the file date of /// the copy should be the same as the original.</param> /// <param name="overwriteIfExists">Flag to indicate if the file /// is to be overwritten if already exists</param> /// <exception cref="IOException"/> /// <exception cref="FileNotFoundException"/> /// <remarks>Ported from Jakarta Commons IO FileUtils</remarks> /// -------------------------------------------------------------------------- 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; } } /// <summary> /// 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. /// </summary> /// <param name="sourcePath">source directory to copy from</param> /// <param name="destinationPath">destination to copy to</param> /// <exception cref="ArgumentException">If the source directory does not exist</exception> /// <exception cref="IOException">if an I/O error occurs while copying the files</exception> public static void CopyFiles(string sourcePath, string destinationPath) { CopyFiles(new DirectoryInfo(sourcePath), new DirectoryInfo(destinationPath)); } /// <summary> /// 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. /// </summary> /// <param name="source">source directory to copy from</param> /// <param name="destination">destination to copy to</param> /// <exception cref="ArgumentException">If the source directory does not exist</exception> /// <exception cref="IOException">if an I/O error occurs while copying the files</exception> 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); } } } }