/// <summary>
 /// コントローラからのイベント受け取り
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 protected virtual void ConvertStateChanged(object sender, ConvertStateChangedEventArgs e)
 {
     // イベントを発行
     e.AllProgress    = (int)(((double)currentFileIndex / SourceFileList.Count) * 100);
     e.AllStatus      = $"{currentFileIndex}/{SourceFileList.Count}";
     e.SourceFilePath = SourceFileList[currentFileIndex];
     OnConvertStateChanged(e);
 }
        /// <summary>
        /// イベントを発生させる
        /// </summary>
        /// <param name="allProgress"></param>
        /// <param name="fileProgress"></param>
        /// <param name="allStatus"></param>
        /// <param name="fileStatus"></param>
        protected virtual void OnConvertStateChanged(int allProgress, int fileProgress, string allStatus, string fileStatus)
        {
            var e = new ConvertStateChangedEventArgs
            {
                AllProgress  = allProgress,
                AllStatus    = allStatus,
                FileProgress = fileProgress,
                FileStatus   = fileStatus
            };

            OnConvertStateChanged(e);
        }
        /// <summary>
        /// プロセスからの標準出力・エラー出力を受け取る
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            // データがnullの場合はプロセスが終了した
            if (e == null)
            {
                outputEndEvent.SetResult(true);
                return;
            }

            // データが空の場合は無視
            if (string.IsNullOrWhiteSpace(e.Data))
            {
                return;
            }

            ConvertStateChangedEventArgs args = new ConvertStateChangedEventArgs
            {
                LogData = e.Data
            };

            // パーセンテージ+残り時間
            if (Constant.RegexLogOutputProgressAndRemain.IsMatch(e.Data))
            {
                GroupCollection groups = Constant.RegexLogOutputProgressAndRemain.Match(e.Data).Groups;
                args.FileProgress = decimal.ToInt32(decimal.Round(decimal.Parse(groups[1].Value)));
                args.FileStatus   = groups[2].Value;
            }
            // パーセンテージのみ
            if (Constant.RegexLogOutputProgress.IsMatch(e.Data))
            {
                GroupCollection groups = Constant.RegexLogOutputProgress.Match(e.Data).Groups;
                args.FileProgress = decimal.ToInt32(decimal.Round(decimal.Parse(groups[1].Value)));
            }
            // イベントを発行
            OnOutputDataReceived(args);
        }
 /// <summary>
 /// イベントを発生させる
 /// </summary>
 /// <param name="e"></param>
 protected virtual void OnConvertStateChanged(ConvertStateChangedEventArgs e)
 {
     ConvertStateChangedEvent?.Invoke(this, e);
 }
 /// <summary>
 /// 変換状態変更イベントを発生させる
 /// </summary>
 /// <param name="e"></param>
 protected virtual void OnOutputDataReceived(ConvertStateChangedEventArgs e)
 {
     ConvertStateChangedEvent?.Invoke(this, e);
 }