Example #1
0
        /// <summary>
        /// 置換実施ボタン押下時の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void ReplaceButton_Click(object sender, RoutedEventArgs e)
        {
            //チェック処理を通過する場合のみ処理する
            if (ValidateReplaceButton())
            {
                /*置換処理開始*/
                ReplaceButton.IsEnabled = false;
                CancelButton.IsEnabled  = false;
                Progress.Maximum        = Int32.MaxValue;
                Progress.Minimum        = 0;
                Progress.Value          = 0;

                // 画面項目からパラメタ取得
                var param = new ReplaceLogicParam()
                {
                    RootDir     = directoryTextBox.Text,
                    FilePattern = filePatternTextBox.Text,
                    IgnoreHide  = IgnoreHideFile.IsChecked.Value,

                    Encoding = Utf8RadioButton.IsChecked.Value ? new UTF8Encoding(false) :
                               EucJpRadioButton.IsChecked.Value ? Encoding.GetEncoding(51932) :
                               SjisRadioButton.IsChecked.Value ? Encoding.GetEncoding(932) :
                               null,

                    Keywords = replaceKeyList.Children.OfType <OneTask>().ToList().Select(c => c.GetParameter()).ToList()
                };

                var logWindow = new ResultWindow();
                logWindow.Folder      = param.RootDir;
                logWindow.FilePattern = param.FilePattern;

                // 置換処理
                db.NewAct();

                var logic = new ReplaceLogic(db);
                logic.AddListener(logWindow.SummaryInformer);
                logic.AddListener(logWindow.DetailInformer);

                var progress = new Progress <int>(SetProgress);
                await Task.Run(() => logic.Do(param, progress));

                /*置換処理完了*/
                MessageBox.Show(this, "置換処理が完了しました", "情報", MessageBoxButton.OK, MessageBoxImage.Information);
                ReplaceButton.IsEnabled = true;
                CancelButton.IsEnabled  = true;

                logWindow.Show();
            }
        }
Example #2
0
        public void Do(ReplaceLogicParam param, IProgress <int> informer)
        {
            //処理対象のファイル一覧
            var targets = new List <string>();

            //ディレクトリを見つけた場合は、一度スタックにつめる
            var directories = new Stack <String>();

            directories.Push(param.RootDir);

            //ディレクトリの中身を確認
            while (directories.Count > 0)
            {
                // ファイルを取得し、ファイル名が処理対象のパターンを満たすか確認
                var directory = directories.Pop();
                foreach (var newFile in Directory.GetFiles(directory))
                {
                    // 隠しファイルは無視するか?
                    if (param.IgnoreHide)
                    {
                        var fileinfo = new FileInfo(newFile);
                        if (fileinfo.Attributes.HasFlag(FileAttributes.Hidden))
                        {
                            continue;
                        }
                    }

                    // パターンのチェック
                    foreach (var filePtnRegex in param.FilePatternRegexes)
                    {
                        if (filePtnRegex.IsMatch(newFile))
                        {
                            // 処理対象
                            targets.Add(newFile);
                            break;
                        }
                    }
                }

                // ディレクトリを取得し、スタックに詰める
                foreach (var newDirectory in Directory.GetDirectories(directory))
                {
                    // 隠しファイルは無視するか?
                    if (param.IgnoreHide)
                    {
                        var dirInfo = new DirectoryInfo(newDirectory);
                        if (dirInfo.Attributes.HasFlag(FileAttributes.Hidden))
                        {
                            continue;
                        }
                    }

                    // 一度スタックにつめる
                    directories.Push(newDirectory);
                }
            }

            // ファイルを1件ずつ置換処理開始
            long index = 1;
            long total = targets.Count;

            foreach (var target in targets)
            {
                try
                {
                    if (Begin != null)
                    {
                        Begin.Invoke(target);
                    }
                    TryReplace(target, param.Encoding, param.Keywords);
                    if (End != null)
                    {
                        End.Invoke();
                    }
                }
                catch (IOException ioe)
                {
                    if (ErrorEnd != null)
                    {
                        ErrorEnd.Invoke(ioe.Message);
                    }
                }

                informer.Report((int)(Int32.MaxValue * index / total));
                ++index;
            }
        }