Мой код работает очень хорошо.
Но, к сожалению, выяснилось, что мой Source-Directory может динамически изменять свою структуру.
Есть ли какой-нибудь меньший и умный код для получения рекурсивных файлов и каталогов и их копирования в новый каталог?
Нужно ли разделять файлы и каталоги?
Любой совет будет очень добрым.
Спасибо.
public void CopyDirFilesRecurse()
{
// copy alle files from source (copy if newer or not existing)
var files = Directory.GetFiles(@"\\cifsShare\source");
var destDir = @"C:\newdir";
foreach (var file in files)
{
FileInfo fileName = new FileInfo(file);
FileInfo destFile = new FileInfo(Path.Combine(destDir, fileName.Name));
if (destFile.Exists)
{
if (fileName.LastWriteTime > destFile.LastWriteTime)
{
fileName.CopyTo(destFile.FullName, true);
}
}
else
{
fileName.CopyTo(destFile.FullName);
}
}
// get all dirs (create if not existing
// copy all files from source)
// if dir exist copy alle files from source (copy if newer or not existing)
var directories = Directory.GetDirectories(@"\\cifsShare\source");
foreach (var dir in directories)
{
DirectoryInfo dirName = new DirectoryInfo(dir);
DirectoryInfo destDirName = new DirectoryInfo(Path.Combine(destDir, dirName.Name));
if (!destDirName.Exists)
{
System.IO.Directory.CreateDirectory(destDirName.FullName);
var filesInDir = Directory.GetFiles(dirName.FullName);
var destDirPath = destDirName.FullName;
foreach (var file in filesInDir)
{
FileInfo fileName = new FileInfo(file);
FileInfo destFile = new FileInfo(Path.Combine(destDirPath, fileName.Name));
if (!destFile.Exists)
{
fileName.CopyTo(destFile.FullName);
}
}
}
else
{
var filesInDir = Directory.GetFiles(dirName.FullName);
var destDirPath = destDirName.FullName;
foreach (var file in filesInDir)
{
FileInfo fileName = new FileInfo(file);
FileInfo destFile = new FileInfo(Path.Combine(destDirPath, fileName.Name));
if (destFile.Exists)
{
if (fileName.LastWriteTime > destFile.LastWriteTime)
{
fileName.CopyTo(destFile.FullName, true);
}
}
else
{
fileName.CopyTo(destFile.FullName);
}
}
}
}
}
EDIT:
Я думаю, что я почти там.
Я нашел способ получить все файлы рекурсивно из источника.
Моя проблема сейчас в том, что мой код копируется из исходных подкаталогов в мой корневой каталог назначения, а не в новый целевой каталог.
Так и будет:
C:\source\a.txt
C:\source\subidr1\b.txt
C:\source\subidr2\c.txt
до
C:\dest\a.txt
C:\dest\subidr1\b.txt
C:\dest\subidr2\c.txt
но это идет к
C:\dest\a.txt
C:\dest\b.txt
C:\dest\c.txt
вот мой код сейчас:
void Test()
{
var sourcePath = @"C:\sourcedir";
var destinationPath = @"C:\newdir";
string[] allFilesSoure = Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories);
foreach (var sourceFile in allFilesSoure)
{
FileInfo InfoSourceFile = new FileInfo(sourceFile);
Debug.WriteLine(InfoSourceFile.FullName);
var newDestinationPath = Path.Combine(destinationPath, InfoSourceFile.Name);
string[] destinationFile = Directory.GetFiles(destinationPath, $"{InfoSourceFile.Name}", SearchOption.AllDirectories);
if (destinationFile.Length == 1)
{
FileInfo InfoDestinationFile = new FileInfo(destinationFile[0]);
if (InfoSourceFile.LastWriteTime > InfoDestinationFile.LastWriteTime)
{
InfoSourceFile.CopyTo(InfoDestinationFile.FullName, true);
}
}
else
{
InfoSourceFile.CopyTo(newDestinationPath);
}
}
}