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);
 }
Exemple #4
0
/// <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);
        }