public InstallationDetails([NotNull] ICopyCallback copyCallback, [CanBeNull] string[] toRemoval, [CanBeNull] Func <CancellationToken, Task> beforeTask, [CanBeNull] Func <CancellationToken, Task> afterTask) { CopyCallback = copyCallback; ToRemoval = toRemoval ?? new string[0]; BeforeTask = beforeTask; AfterTask = afterTask; }
protected virtual async Task CopyFileEntries([NotNull] ICopyCallback callback, IProgress <AsyncProgressEntry> progress, CancellationToken cancellation) { var list = (await GetFileEntriesAsync(cancellation))?.ToList(); if (list == null) { return; } var files = list.OfType <IFileInfo>().ToList(); for (var i = 0; i < files.Count; i++) { var fileInfo = files[i]; var destination = callback.File(fileInfo); if (destination != null) { FileUtils.EnsureFileDirectoryExists(destination); progress?.Report(Path.GetFileName(destination), i, files.Count); await fileInfo.CopyToAsync(destination); if (cancellation.IsCancellationRequested) { return; } } } var directories = list.OfType <IDirectoryInfo>().ToList(); for (var i = 0; i < directories.Count; i++) { var directoryInfo = directories[i]; var destination = callback.Directory(directoryInfo); if (destination != null) { FileUtils.EnsureDirectoryExists(destination); } } }
public async Task InstallAsync([NotNull] ICopyCallback callback, IProgress <AsyncProgressEntry> progress, CancellationToken cancellation) { await CopyFileEntries(callback, progress, cancellation); }
/// <summary> /// Copy directory and optionally subdirectories with overwrite /// </summary> /// <param name="sourceDir"></param> /// <param name="destDir"></param> /// <param name="copySubDirs"></param> /// <param name="copyIniFiles"></param> /// <param name="cb">Callback for status and log messages</param> /// <returns></returns> public static string CopyDirectory( string sourceDir, string destDir, bool copySubDirs, bool copyIniFiles, ICopyCallback cb) { String[] Files; string msgList = "", msg; if (cb != null) { cb.UpdateStatus("Copying Files..."); } if (cb != null) { cb.LogMessage("Copying Directory " + sourceDir + " to " + destDir); } if (destDir[destDir.Length - 1] != Path.DirectorySeparatorChar) { destDir += Path.DirectorySeparatorChar; // add separator to dest } if (!Directory.Exists(destDir)) { try { if (cb != null) { cb.LogMessage("Creating Directory " + destDir); } Directory.CreateDirectory(destDir); } catch (Exception ex) { msg = "Directory.CreateDirectory Exception, " + destDir + ", " + ex.Message; if (cb != null) { cb.LogMessage(msg); } msgList += msg + "\r\n"; } } Files = Directory.GetFileSystemEntries(sourceDir); foreach (string srcFile in Files) { string dstFile = ""; // Sub directories if (Directory.Exists(srcFile)) { if (!copySubDirs) { continue; } string dirName = Path.GetFileName(srcFile); if (Lex.Eq(dirName, "temp") || Lex.Eq(dirName, "cache")) // don't copy these { continue; } dstFile = destDir + Path.GetFileName(srcFile); msgList += CopyDirectory(srcFile, destDir + Path.GetFileName(srcFile), true, copyIniFiles, cb); } // Files in directory else { string fileName = Path.GetFileName(srcFile); if (!copyIniFiles) { if (String.Compare(Path.GetExtension(fileName), ".ini", true) == 0) { continue; // don't copy .ini files } if (String.Compare(Path.GetExtension(fileName), ".config", true) == 0) { continue; // don't copy .config files } if (String.Compare(Path.GetExtension(fileName), ".log", true) == 0) { continue; // don't copy .log files } } dstFile = destDir + fileName; FileInfo rfi = new FileInfo(srcFile); // remote file FileInfo lfi = new FileInfo(dstFile); // local file if (lfi.Exists) { if (lfi.LastWriteTime.CompareTo(rfi.LastWriteTime) >= 0 && lfi.Length == rfi.Length) { continue; // continue if same date or newer and same size } try { // delete/rename the existing file System.IO.File.SetAttributes(dstFile, FileAttributes.Normal); // set attributes to normal in case file is read only System.IO.File.Delete(dstFile); } catch (Exception ex) // try rename if delete fails { try { cb.LogMessage("Delete failed, attempting rename of: " + dstFile); string dstFileOld = dstFile + ".old"; if (File.Exists(dstFileOld)) { System.IO.File.SetAttributes(dstFileOld, FileAttributes.Normal); // set attributes to normal in case file is read only File.Delete(dstFileOld); } File.Move(dstFile, dstFileOld); } catch (Exception ex2) { msg = "File.Delete/Rename Exception, source = " + srcFile + ", dest = " + dstFile + "\r\n" + ex.Message; if (cb != null) { cb.LogMessage(msg); } } } } if (cb != null) { cb.UpdateStatus("Copying File: " + fileName); } try { if (cb != null) { cb.LogMessage("Copying file " + srcFile + " to " + dstFile); } System.IO.File.Copy(srcFile, dstFile, true); } catch (Exception ex) { msg = "File.Copy Exception, source = " + srcFile + ", dest = " + dstFile + "\r\n" + ex.Message; if (cb != null) { cb.LogMessage(msg); } msgList += msg + "\r\n"; } } } return(msgList); }