[C#] Копирование содержимого каталогов вместе с подкаталогам
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.05.06 17:20
Оценка: 13 (2)
Собственно объяснять думаю нечего.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Rsdn.Utils
{
    enum Overwrite
    {
        No,
        Older,
        All,
    }

    static class Utils
    {
        public static void CopyDirs(string sorseRoot, string destRoot, Overwrite overwrite)
        {
            foreach (string dir in Directory.GetDirectories(
                    sorseRoot, "*.*", SearchOption.AllDirectories))
            {
                string dirName = Path.GetFileName(dir);
                string destSubDor = Path.Combine(destRoot, dirName);
                Directory.CreateDirectory(destSubDor);
                string sorseSubDor = Path.Combine(sorseRoot, dirName);
                CopyDirs(sorseSubDor, destSubDor, overwrite);
            }

            foreach (string filePath in Directory.GetFiles(sorseRoot))
            {
                string fileName = Path.GetFileName(filePath);
                string destPath = Path.Combine(destRoot, fileName);
                bool exists = File.Exists(destPath);

                if (exists)
                {
                    switch (overwrite)
                    {
                        case Overwrite.Older:
                            if (new FileInfo(filePath).LastWriteTimeUtc 
                                > new FileInfo(destPath).LastWriteTimeUtc)
                            {
                                File.Copy(filePath, destPath, true);
                            }
                            break;
                        case Overwrite.All:
                            File.Copy(filePath, destPath, true);
                            break;
                    }
                }
                else
                    File.Copy(filePath, destPath, true);
            }
        }
    }
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [C#] Копирование содержимого каталогов вместе с подкатал
От: MaxxK  
Дата: 09.05.06 06:23
Оценка: 31 (2)
Раз уж подняли такую тему, выложу здесь же еще 2 функции.
CopyIfNewer — копирует файл. Если файл-destination существует, то перезаписывает его в том случае, если файл-источник имеет более позднее время последней записи.
DeleteDirectory — удаляет непустой каталог вместе со всеми подкаталогами и файлами.


using System;
using System.IO;

namespace MaxxK
{
    /// <summary>
    /// Вспомогательный класс для работы с файловой системой
    /// </summary>
    public static class FileSystem
    {
        /// <summary>
        /// Процедура копирует файл, заменяя его в случае, если источник имеет более поздее время записи.
        /// </summary>
        /// <param name="source">Путь к источнику</param>
        /// <param name="destination">Путь для копирования</param>
        public static void CopyIfNewer(string source, string destination)
        {
            if (File.Exists(destination))
            {
                if (File.GetLastWriteTime(destination)>=File.GetLastWriteTime(source))
                    return;
                else
                    File.Delete(destination);
            }
            File.Copy(source, destination);
        }
        
        /// <summary>
        /// Удаляет каталог вместе со всеми подкаталогами и файлами, находящимися в нем
        /// </summary>
        /// <param name="path">Путь к удаляемому каталогу</param>
        public static void DeleteDirectory(string path)
        {
            string[] subdirs = Directory.GetDirectories(path);
            if (subdirs.Length != 0)
            {
                foreach (string subdir in subdirs)
                {
                    DeleteDirectory(subdir);
                }
            }
            
            string[] files = Directory.GetFiles(path);
            
            foreach (string file in files)
            {
                File.Delete(file);
            }
            
            Directory.Delete(path);
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.