VB.NET
Public Shared Sub CopyDirectory(ByVal sourceDirName As String, _
ByVal destDirName As String, _
ByVal newerOnly As Boolean, _
ByVal sync As Boolean)
If Not Directory.Exists(destDirName) Then
Directory.CreateDirectory(destDirName)
File.SetAttributes(destDirName, File.GetAttributes(sourceDirName))
End If
If destDirName(destDirName.Length - 1) <> Path.DirectorySeparatorChar Then
destDirName = destDirName + Path.DirectorySeparatorChar
End If
Dim files As String() = Directory.GetFiles(sourceDirName)
Dim f As String
For Each f In files
Dim destFileName As String = destDirName + Path.GetFileName(f)
If Not newerOnly OrElse _
Not File.Exists(destFileName) OrElse _
File.GetLastWriteTime(destFileName) < File.GetLastWriteTime(f) Then
File.Copy(f, destFileName, True)
End If
Next
If sync Then
DeleteNotExistFiles(sourceDirName, destDirName)
End If
Dim dirs As String() = Directory.GetDirectories(sourceDirName)
Dim dir As String
For Each dir In dirs
CopyDirectory(dir, destDirName + Path.GetFileName(dir), newerOnly, sync)
Next
End Sub
Private Shared Sub DeleteNotExistFiles(ByVal sourceDirName As String, _
ByVal destDirName As String)
If sourceDirName(sourceDirName.Length - 1) <> Path.DirectorySeparatorChar Then
sourceDirName = sourceDirName + Path.DirectorySeparatorChar
End If
Dim files As String() = Directory.GetFiles(destDirName)
Dim f As String
For Each f In files
If Not File.Exists(sourceDirName + Path.GetFileName(f)) Then
File.Delete(f)
End If
Next
Dim folders As String() = Directory.GetDirectories(destDirName)
Dim folder As String
For Each folder In folders
If Not Directory.Exists(sourceDirName + Path.GetFileName(folder)) Then
Directory.Delete(folder, True)
End If
Next
End Sub
CopyDirectory("C:\test1", "C:\test2", True, True)
C#public static void CopyDirectory(
string sourceDirName,
string destDirName,
bool newerOnly,
bool sync)
{
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
File.SetAttributes(destDirName, File.GetAttributes(sourceDirName));
}
if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar)
{
destDirName = destDirName + Path.DirectorySeparatorChar;
}
string[] files = Directory.GetFiles(sourceDirName);
foreach (string f in files)
{
string destFileName = destDirName + Path.GetFileName(f);
if (!newerOnly ||
!File.Exists(destFileName) ||
File.GetLastWriteTime(destFileName) < File.GetLastWriteTime(f))
{
File.Copy(f, destFileName, true);
}
}
if (sync)
{
DeleteNotExistFiles(sourceDirName, destDirName);
}
string[] dirs = Directory.GetDirectories(sourceDirName);
foreach (string dir in dirs)
{
CopyDirectory(dir, destDirName + Path.GetFileName(dir), newerOnly, sync);
}
}
private static void DeleteNotExistFiles(
string sourceDirName,
string destDirName)
{
if (sourceDirName[sourceDirName.Length - 1] != Path.DirectorySeparatorChar)
{
sourceDirName = sourceDirName + Path.DirectorySeparatorChar;
}
string[] files = Directory.GetFiles(destDirName);
foreach (string f in files)
{
if (!File.Exists(sourceDirName + Path.GetFileName(f)))
{
File.Delete(f);
}
}
string[] folders = Directory.GetDirectories(destDirName);
foreach (string folder in folders)
{
if (!Directory.Exists(sourceDirName + Path.GetFileName(folder)))
{
Directory.Delete(folder, true);
}
}
}
CopyDirectory("C:\\test1", "C:\\test2", true, true);