浏览代码

修复取消批量下载后临时文件不能删除的问题

Jimmy 2 年之前
父节点
当前提交
d005db86f9

+ 12 - 4
fis/Managers/FileExporterManager.cs

@@ -36,7 +36,7 @@ namespace fis.Win.Dev.Managers
         private CancellationToken _cancelToken;
         private int _fileFinishCount = 0;
         private ExportStatus _exportStatus;
-
+        public bool IsCancelled => _cancelTokenSource.IsCancellationRequested;
         public ExportStatus ExportStatus
         {
             get { return _exportStatus; }
@@ -82,10 +82,10 @@ namespace fis.Win.Dev.Managers
         public bool AbortExportOperation()
         {
            _cancelTokenSource?.Cancel();
+            _fileFinishCount = 0;
             ExportStatus = ExportStatus.Downloading;
             Task.Run(() =>
             {
-                FFmpegService.ForceCloseFFmpegIfStillAlive();
                 Thread.Sleep(500);
                 DeleteTheTemps(_downloadFolder);
             }
@@ -109,7 +109,14 @@ namespace fis.Win.Dev.Managers
             }
             Task.Run(() =>
             {
-                DoExport(dataObj);
+                try
+                {
+                    DoExport(dataObj);
+                }
+                finally {
+                  
+                }
+               
             });
             return true;
         }
@@ -305,7 +312,8 @@ namespace fis.Win.Dev.Managers
                 }
             }
             catch(Exception ex) {
-                Logger.WriteShellLog(ex.ToString());
+                FFmpegService.ForceCloseFFmpegIfStillAlive();
+                DeleteTheTemps(_downloadFolder);
             }
           
         }

+ 2 - 0
fis/Managers/Interfaces/IFileExporterManager.cs

@@ -13,5 +13,7 @@ namespace fis.Managers.Interfaces
         bool ExportPatientZipFile(string data, String fileName);
 
         bool AbortExportOperation();
+
+        bool IsCancelled { get; }
     }
 }

+ 23 - 4
fis/Utilities/FFMPEG/Video/FFmpegVideoWriter.cs

@@ -1,4 +1,6 @@
-using fis.Win.Dev.Utilities.FFMPEG.ArgsBuilder;
+using fis.Managers;
+using fis.Managers.Interfaces;
+using fis.Win.Dev.Utilities.FFMPEG.ArgsBuilder;
 using fis.Win.Dev.Utilities.FFMPEG.Settings;
 using System;
 using System.Collections.Generic;
@@ -56,8 +58,11 @@ namespace fis.Win.Dev.Utilities.FFMPEG.Video
                 output.AddArg("vf", $"scale={resizeWidth}:{resizeHeight}");
             }
             var argument = argsBuilder.GetArgs();
-
-            FFmpegService.StartFFmpeg(out _ffmpeg, argument);
+           var exportManager = AppManager.Get<IFileExporterManager>();
+            if (!exportManager.IsCancelled)
+            {
+                FFmpegService.StartFFmpeg(out _ffmpeg, argument);
+            }
         }
 
         /// <summary>
@@ -75,9 +80,14 @@ namespace fis.Win.Dev.Utilities.FFMPEG.Video
         /// </summary>
         public void WriteFrame(BitmapFrame frame)
         {
+            var exportManager = AppManager.Get<IFileExporterManager>();
+            if (!exportManager.IsCancelled)
+            {
+                return;
+            }
             if (_ffmpeg.HasExited)
             {
-                throw new FFmpegException(_ffmpeg.ExitCode);
+                _ffmpeg.Kill();
             }
             _waitEvent.Reset();
             bool success = true;
@@ -86,7 +96,16 @@ namespace fis.Win.Dev.Utilities.FFMPEG.Video
             {
                 try
                 {
+                    var exportManager = AppManager.Get<IFileExporterManager>();
+                    if (!exportManager.IsCancelled)
+                    {
+                        return;
+                    }
                     _ffmpeg.StandardInput.BaseStream.Write(frame.Data, 0, frame.Data.Length);
+                    if (!exportManager.IsCancelled)
+                    {
+                        return;
+                    }
                     _ffmpeg.StandardInput.BaseStream.Flush();
                     _waitEvent.Set();
                 }

+ 13 - 6
fis/Utilities/FFMPEG/VideoFFmpegHelper.cs

@@ -1,4 +1,6 @@
 using fis.Log;
+using fis.Managers;
+using fis.Managers.Interfaces;
 using fis.Vid;
 using fis.Win.Dev.Utilities.FFMPEG.Settings;
 using fis.Win.Dev.Utilities.FFMPEG.Video;
@@ -20,22 +22,23 @@ namespace fis.Win.Dev.Utilities.FFMPEG
         #region  
         private Stream _stream;
         private VinnoImageData _vid;
-        private const string Header = "VINNO IMAGE DATA";
+        private IFileExporterManager _exportManager;
 
-        private long _basePosition;
-
-      
         public int FrameRate { get; set; }
 
         public int ImageCount { get; set; }
         public VideoFFmpegHelper(string path)
         {
             ExportVideo(path);
+            _exportManager = AppManager.Get<IFileExporterManager>();
         }
 
         public void ExportVideo(string path)
         {
+            FFmpegService.SetFFmpegPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SmartPublisher","ffmpeg.exe"));
+#if DEBUG
             FFmpegService.SetFFmpegPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ffmpeg.exe"));
+#endif
             _stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
             _vid = new VinnoImageData(_stream);
             FrameRate = (int) _vid.Probe.FrameRate;
@@ -146,10 +149,14 @@ namespace fis.Win.Dev.Utilities.FFMPEG
                         VideoCodec = FFmpegVideoCodec.X264
                     };
                     using (var videoWriter = new FFmpegVideoWriter(writeArgs, setting))
-                    {
+                    {                       
                         for (var i = 0; i < ImageCount; i++)
                         {
-                            SKBitmap bitmap = GetBitmap(i);
+                            if (_exportManager.IsCancelled)
+                            {
+                                break;
+                            }
+                              SKBitmap bitmap = GetBitmap(i);
                             if (bitmap != null && (bitmap.Width != width || bitmap.Height != height))
                             {
                                 bitmap = bitmap.Resize(new SKImageInfo(width, height), SKFilterQuality.None);