Ejemplo n.º 1
0
        public JsonResult refreshDir(string currPage)
        {
            string       path = "";
            DirInfoModel dim  = new DirInfoModel();

            string curr = getPath(currPage);

            path = Server.MapPath("~/App_Data" + curr);

            DirInfoModel dim2 = new DirInfoModel();

            dim2 = getDirDetails(path);

            dim.status  = dim2.status;
            dim.folders = dim2.folders;
            dim.files   = dim2.files;
            dim.curr    = curr;

            if (dim2.status == "500")
            {
                dim.curr = null;
            }

            return(Json(dim, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 2
0
        //Functions
        private DirInfoModel getDirDetails(string path)
        {
            DirInfoModel dim = new DirInfoModel();

            try
            {
                List <FileInfoModel>   fileInfo   = new List <FileInfoModel>();
                List <FolderInfoModel> folderInfo = new List <FolderInfoModel>();
                DirectoryInfo          dir        = new DirectoryInfo(path);
                DirectoryInfo[]        subDir     = dir.GetDirectories();
                FileInfo[]             files      = dir.GetFiles();

                foreach (DirectoryInfo d in subDir)
                {
                    folderInfo.Add(new FolderInfoModel
                    {
                        folderName = d.Name
                    });
                }
                foreach (FileInfo f in files)
                {
                    fileInfo.Add(new FileInfoModel
                    {
                        fileName = f.Name,
                        size     = convertFileSize(f.Length)
                    });
                }

                if (fileInfo.Count() < 1)
                {
                    dim.files = null;
                }
                else
                {
                    dim.files = fileInfo;
                }

                if (folderInfo.Count() < 1)
                {
                    dim.folders = null;
                }
                else
                {
                    dim.folders = folderInfo;
                }

                dim.status = "200";
                return(dim);
            }
            catch (Exception e)
            {
                dim.status  = "500";
                dim.files   = null;
                dim.folders = null;
                return(dim);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Копирование файлов.
        /// </summary>
        public void CopyRun(Dispatcher DGUI, DirInfoModel infoModel, Status status)
        {
            DGUI.BeginInvoke(() =>
            {
                status.IsError = false;
                status.Message = "Подготовка к копированию..";
                infoModel.OnWorking();
            }, DispatcherPriority.Normal);

            if (infoModel == null || !infoModel.CanWork)
            {
                DGUI.BeginInvoke(() =>
                {
                    status.IsError = true;
                    status.Message = "Нет данных";
                    if (infoModel != null)
                    {
                        infoModel.CanPrepare = true;
                    }
                });
                return;
            }
            //+ doing
            DGUI.BeginInvoke(() =>
            {
                status.Message = "Копирование..";
            });
            var       currentIndex = 0;
            Stopwatch stopWatch    = new Stopwatch();

            stopWatch.Start();
            var totalForCopy = infoModel.NewFilesFrom + infoModel.ReplaceFilesFrom; //- в идеале подсчитать с учетом отмененных (когда будет реализация)

            foreach (var item in infoModel.Items)
            {
                CopyItemWithInners(DGUI, infoModel, item, status, totalForCopy, stopWatch, ref currentIndex);
            }
            stopWatch.Stop();
            //+ stats
            DGUI.BeginInvoke(() =>
            {
                if (infoModel.Errors.Any())
                {
                    status.IsError       = true;
                    status.Message       = String.Format("Копирование завершено с ошибками (ошибок: {0})", infoModel.Errors.Count());
                    infoModel.CanPrepare = true;
                    infoModel.CanWork    = true; //- если была ошибка, то даем сразу еще возможность попробовать (может, исправили что-то с правами доступа или т.п.)
                }
                else
                {
                    status.IsError       = false;
                    status.Message       = "Копирование завершено";
                    infoModel.CanPrepare = true;
                }
            });
        }
Ejemplo n.º 4
0
 private void Init()
 {
     // mvvm
     _projects  = (ProjectsIn)this.TryFindResource("projects");
     _infoModel = (DirInfoModel)this.TryFindResource("infoModel");
     _status    = (Status)this.TryFindResource("status");
     // ok
     _inited = true;
     // autostart
     LoadConfigData();
 }
Ejemplo n.º 5
0
        public JsonResult getDir(string folder, string currPage)
        {
            string       path = "";
            DirInfoModel dim  = new DirInfoModel();

            string curr = getPath(currPage);

            if (folder == "" || folder == null)
            {
                path     = Server.MapPath("~/App_Data" + curr);
                dim.curr = "/";
            }
            else
            {
                if (curr == "/")
                {
                    path     = Server.MapPath("~/App_Data" + curr + folder);
                    dim.curr = curr + folder;
                }
                else
                {
                    path     = Server.MapPath("~/App_Data" + curr + "/" + folder);
                    dim.curr = curr + "/" + folder;
                }
            }

            DirInfoModel dim2 = new DirInfoModel();

            dim2 = getDirDetails(path);

            dim.status  = dim2.status;
            dim.folders = dim2.folders;
            dim.files   = dim2.files;

            if (dim2.status == "500")
            {
                dim.curr = null;
            }
            return(Json(dim, JsonRequestBehavior.AllowGet));
        }
Ejemplo n.º 6
0
        private void CopyItemWithInners(Dispatcher DGUI, DirInfoModel infoModel, DirTreeViewItemModel item, Status status, Int32 totalCount, Stopwatch stopWatch, ref Int32 currentIndex)
        {
            if (item == null)
            {
                return;
            }
            if (item.IsExcludeFromWork)
            {
                return;
            }
            if (!infoModel.IsCopyWithErrorAfterPrepare && !item.IsDir && item.Status == DirTreeViewItemModelStatus.Error)
            {
                return;                                                                                                           // с ошибками не трогаем
            }
            //+ copy file
            if (!item.IsDir)
            {
                //+ count (loading steps) - только файлы считаем
                var      index = currentIndex++;
                TimeSpan ts    = stopWatch.Elapsed;
                DGUI.BeginInvoke(() =>
                {
                    status.Message = String.Format("Копирование.. {0}/{1} ({2:00}:{3:00}:{4:00})", index, totalCount, ts.Hours, ts.Minutes, ts.Seconds);
                });

                try
                {
                    System.IO.File.Copy(item.SourcePath, item.DistancePath, true);
                    DGUI.BeginInvoke(() =>
                    {
                        item.AsSuccess();
                    });
                }
                catch (Exception ex)
                {
                    var msg = ex.Message; //? to last inner msg?
                    DGUI.BeginInvoke(() =>
                    {
                        item.AsError(msg);
                        infoModel.Errors.Add(msg);
                    });
                }
            }
            //+ create dir
            else
            {
                try
                {
                    if (!System.IO.Directory.Exists(item.DistancePath))
                    {
                        System.IO.Directory.CreateDirectory(item.DistancePath);
                        DGUI.BeginInvoke(() =>
                        {
                            item.AsSuccess();
                        });
                    }
                    else
                    {
                        //- директория уже была, и мы ничего не делали, но мы все-равно ее подсветим успешно
                        DGUI.BeginInvoke(() =>
                        {
                            item.AsSuccess();
                        });
                    }
                }
                catch (Exception ex)
                {
                    var msg = ex.Message; //? to last inner msg?
                    DGUI.BeginInvoke(() =>
                    {
                        item.AsError(msg);
                        infoModel.Errors.Add(msg);
                    });
                }
            }
            //+ childs
            foreach (var itemChild in item.Items)
            {
                CopyItemWithInners(DGUI, infoModel, itemChild, status, totalCount, stopWatch, ref currentIndex);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Подготовка к копированию. Сбор сведений.
        /// </summary>
        public void Prepare(Dispatcher DGUI, ProjectItemIn projectSettings, DirInfoModel infoModel, Status status)
        {
            DGUI.BeginInvoke(() =>
            {
                status.IsError = false;
                status.Message = "Подготовка..";
                infoModel.OnPreparing();
            }, DispatcherPriority.Normal);
            //+ checks
            if (projectSettings == null)
            {
                DGUI.BeginInvoke(() =>
                {
                    status.IsError       = true;
                    status.Message       = "Укажите проект";
                    infoModel.CanPrepare = true;
                });
                return;
            }
            if (String.IsNullOrWhiteSpace(projectSettings.DirFrom))
            {
                DGUI.BeginInvoke(() =>
                {
                    status.IsError       = true;
                    status.Message       = "Укажите путь к источникам";
                    infoModel.CanPrepare = true;
                });
                return;
            }
            if (String.IsNullOrWhiteSpace(projectSettings.DirTo))
            {
                DGUI.BeginInvoke(() =>
                {
                    status.IsError       = true;
                    status.Message       = "Укажите путь назначения";
                    infoModel.CanPrepare = true;
                });
                return;
            }
            var       dirUtils   = new DirectoryUtils();
            var       totalFiles = 0;
            Stopwatch stopWatch  = new Stopwatch();

            stopWatch.Start();
            var             filePrepareIndex = 0;
            Action <String> onCheckFn        = (d) =>
            {
                TimeSpan ts = stopWatch.Elapsed; //? а точно ли в этом потоке замер времени останалвивать?
                DGUI.BeginInvoke(() =>
                {
                    status.Message = String.Format("Подготовка (шаг 1).. {0} ({1:00}:{2:00}:{3:00}) -> {4}", ++filePrepareIndex, ts.Hours, ts.Minutes, ts.Seconds, d);
                });
            };
            //+ 1. ищем все папки для работы (исходящие)
            var dirsIgnore = dirUtils.SearchDirs(StringUtils.StringSplitNewLines(projectSettings.DirFromIgnore), null, onCheckFn); //, Conventions.DirSeparatorStr);
            var dirs       = dirUtils.SearchDirs(StringUtils.StringSplitNewLines(projectSettings.DirFrom), dirsIgnore, onCheckFn); //, Conventions.DirSeparatorStr);

            //+ 2. собираем все файлы (с их полными путями) для копирования
            var             filePrepareTwoIndex = 0;
            Action <String> onCheckFilesFn      = (f) =>
            {
                TimeSpan ts = stopWatch.Elapsed; //? а точно ли в этом потоке замер времени останалвивать?
                DGUI.BeginInvoke(() =>
                {
                    status.Message = String.Format("Подготовка (шаг 2).. {0} ({1:00}:{2:00}:{3:00}) -> {4}", ++filePrepareTwoIndex, ts.Hours, ts.Minutes, ts.Seconds, f);
                });
            };
            var files = dirUtils.SearchFiles(dirs, onCheckFilesFn);

            totalFiles = files.Count;

            //+ 3. ищем среди имеющихся по назначению уже точно такие-же (если нет таких файлов или новые, то отдаем в работу) - ради чего все и затеялось
            var dirFromStr = projectSettings.DirFrom;

            if (dirFromStr.EndsWith(Conventions.DirSubdirSymbol))
            {
                dirFromStr = dirFromStr.Remove(dirFromStr.Length - 1);
            }
            var fileIndex = 0;

            foreach (var file in files)
            {
                TimeSpan ts = stopWatch.Elapsed; //? а точно ли в этом потоке замер времени останалвивать?
                DGUI.BeginInvoke(() =>
                {
                    status.Message = String.Format("Подготовка (шаг 3).. {0}/{1} ({2:00}:{3:00}:{4:00})", ++fileIndex, totalFiles, ts.Hours, ts.Minutes, ts.Seconds);
                });
                if (String.IsNullOrWhiteSpace(file))
                {
                    continue;
                }
                if (!file.StartsWith(dirFromStr))
                {
                    continue;                               //- странно
                }
                //- приводим к пути назначению
                var fileOut = String.Format("{0}\\{1}", projectSettings.DirTo, file.Remove(0, dirFromStr.Length));
                fileOut = fileOut.Replace("\\\\", "\\"); //? to regexp (учесть не только двойные слэши, но и множественные?)
                // NOTE: метод "infoModel.AddFile()" может не лучший по оптимизации для TreeView
                // NOTE: возможно, для TreeView делать разовую обновку быстрее, чем на каждом файле
                //- если новый, то точно копируем
                if (!dirUtils.ExistsFile(fileOut))
                {
                    DGUI.BeginInvoke(() =>
                    {
                        infoModel.AddFile(file, fileOut, true, DirTreeViewItemModelStatus.Normal, String.Empty);
                    });
                }
                //- если уже есть такой, то смотрим своим алгоритмом - вся суть приложения
                else
                {
                    var isFileInWork = false;
                    try
                    {
                        isFileInWork = IsFileForReplaceAlgo(file, fileOut, projectSettings, dirUtils);
                    }
                    catch (Exception ex)
                    {
                        // некоторая ошибка при сравнении файлов (возможно, не смогли сверить контент)
                        DGUI.BeginInvoke(() =>
                        {
                            infoModel.Errors.Add(ex.Message);
                            infoModel.AddFile(file, fileOut, false, DirTreeViewItemModelStatus.Error, ex.Message);
                        });
                    }

                    if (isFileInWork)
                    {
                        DGUI.BeginInvoke(() =>
                        {
                            infoModel.AddFile(file, fileOut, false, DirTreeViewItemModelStatus.Normal, String.Empty);
                        });
                    }
                }
            }
            stopWatch.Stop();

            //+ end (summary)
            DGUI.BeginInvoke(() =>
            {
                infoModel.TotalFilesFrom  = totalFiles;
                infoModel.CanWork         = infoModel.Items.Any(); // files.Any(); // TODO: в идеале проверить не отмененные файлы и директории
                infoModel.CanPrepare      = true;
                infoModel.ErrorsFilesFrom = infoModel.Errors.Count();
                if (infoModel.ErrorsFilesFrom > 0)
                {
                    status.IsError = true;
                    status.Message = String.Format("Подготовка завершена с ошибками (ошибок: {0})", infoModel.ErrorsFilesFrom);
                }
                else
                {
                    status.Message = "Подготовка завершена";
                }
            });
        }