/// <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(); } }
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; } }