In C# we have the ability to move Directories or Files using System.IO.File.Move(sourceFile, destFile) and System.IO.Directory.Move(sourceDirPath, destDirPath) (making sure your paths use the string literal, ie var sourceDirPath = @"C:\Users\Public\public\test\"), however sadly there is no way to easily copy or delete entire directories (there is no Directory.Copy(fromDir, toDir) method available to us, only File.Copy(fromFile, toFile); and Directory.Delete(dir) only works for empty directories, so we need to empty them recursively!!). I have pulled together two methods to do this recursively.
The first is CopyAllDirectoriesAndFiles(string fromDirectory, string toDirectory), and also uses another method EnsureDirectoryExists(string dir):
private static void CopyAllDirectoriesAndFiles(string fromDirectory, string toDirectory) {
if (Directory.Exists(fromDirectory)) {
string[] files = Directory.GetFiles(fromDirectory);
// make sure it exists
EnsureDirectoryExists(toDirectory);
// Copy the files and overwrite destination files if they already exist.
foreach (string file in files) {
var fileName = Path.GetFileName(file);
var destFile = Path.Combine(toDirectory, fileName);
File.Copy(file, destFile, true);
}
var di = new DirectoryInfo(fromDirectory);
DirectoryInfo[] subDirs = di.GetDirectories();
foreach (DirectoryInfo dirInfo in subDirs) {
var directoryName = dirInfo.Name;
var fromPath = Path.Combine(fromDirectory, directoryName);
var toPath = Path.Combine(toDirectory, directoryName);
EnsureDirectoryExists(toPath);
// copy all files and folders across recursively
CopyAllDirectoriesAndFiles(fromPath, toPath);
}
}
}
private static void EnsureDirectoryExists(string dir) {
if (!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
}
The second is DeleteAllDirectoriesAndFiles(string topDirectory):
private static void DeleteAllDirectoriesAndFiles(string topDirectory) {
if (Directory.Exists(topDirectory)) {
string[] files = Directory.GetFiles(topDirectory);
foreach (string file in files) {
File.Delete(file);
}
var di = new DirectoryInfo(topDirectory);
DirectoryInfo[] subDirs = di.GetDirectories();
foreach (DirectoryInfo dirInfo in subDirs) {
var directoryName = dirInfo.Name;
var fromPath = Path.Combine(topDirectory, directoryName);
// delete all files and folders recursively
DeleteAllDirectoriesAndFiles(fromPath);
}
// delete this folder
Directory.Delete(topDirectory);
}
}
Hopefully the inline comments are self-explanatory, if not, hit me up in the comments and I’ll provide you with more detail.
recent comments