/// <summary>
        ///
        /// </summary>
        public void Synchronize()
        {
            Directory.CreateDirectory(Source);
            Directory.CreateDirectory(Target);
            var  src      = new DirectoryStructure(Source);
            var  trg      = new DirectoryStructure(Target);
            bool waserror = false;

            foreach (var fileItem in src.GetDiff(trg))
            {
                try{
                    Log.Trace("start " + fileItem);
                    Apply(fileItem);
                    Log.Info("complete " + fileItem);
                }
                catch (Exception ex) {
                    Log.Error("error " + fileItem, ex);
                    waserror = true;
                }
            }
            if (!waserror)
            {
                var hash = src.GetStampFile().ToString();
                File.WriteAllText(Path.Combine(Target, DirectoryStructure.SyncFileName), hash);
                File.WriteAllText(Path.Combine(Source, DirectoryStructure.SyncFileName), hash);
                Log.Info("stamp file wrote");
            }
            else
            {
                Log.Error("stamp not written due to some exceptions");
            }
        }
        /// <summary>
        /// Получить разницу между исходной и целевой директорией
        /// </summary>
        /// <returns></returns>
        public IEnumerable <FileItem> GetDifference()
        {
            var src = new DirectoryStructure(Source);
            var trg = new DirectoryStructure(Target);

            return(src.GetDiff(trg));
        }