Собственно объяснять думаю нечего.
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>>
Раз уж подняли такую тему, выложу здесь же еще 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);
}
}
}