■■■

2016年4月3日日曜日

フォルダ内部のファイルで同期をとる方法

フォルダ内部のファイルで同期をとる方法
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);

■■■