namespace Pilz.Updating.Client; public static class Utils { public static void CopyFiles(DirectoryInfo sourceDir, DirectoryInfo destinationDir) { if (!destinationDir.Exists) destinationDir.Create(); foreach (FileInfo sFile in sourceDir.EnumerateFiles("*", SearchOption.TopDirectoryOnly)) { var dFile = new FileInfo(Path.Combine(destinationDir.FullName, sFile.Name)); CopyFile(sFile, dFile); } foreach (DirectoryInfo sDir in sourceDir.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)) { var dDir = destinationDir.CreateSubdirectory(sDir.Name); CopyFiles(sDir, dDir); } } public static void CopyFile(FileInfo sourceFile, FileInfo destinationFile) { var triesLeft = 1; var srcFileName = sourceFile.FullName; var destFileName = destinationFile.FullName; string? oldFile = null; while (triesLeft > 0) { triesLeft--; try { File.Copy(srcFileName, destFileName, true); } catch (IOException) { if (triesLeft == 0 && File.Exists(destFileName)) { oldFile = destFileName + ".old"; if (File.Exists(oldFile)) File.Delete(oldFile); File.Move(destFileName, oldFile); triesLeft++; Thread.Sleep(100); } } catch (Exception) { } } if (oldFile != null) { try { File.Delete(oldFile); } catch (Exception) { } } } }