internal static IDelegateCommand CreateCopyToClipBoardCommand(IHexDataContext hexDataContext) { var copyToClipBoardCommand = CommandFactory.CreateDelegateCommand( () => { if (hexDataContext.SelectionStart == -1 || hexDataContext.SelectionLength == -1) { return; } //若需剪切数据大于4GB,提示警告; if (hexDataContext.SelectionLength - hexDataContext.SelectionStart > MaxCopyToClipBoardSize) { MsgBoxService.Current?.Show(LanguageService.Current?.FindResourceString(Constants.MsgText_TooLargeCopySize)); return; } hexDataContext.Stream.Position = hexDataContext.SelectionStart; InterceptStream sourceStream = null; StreamReader sr = null; try { sourceStream = InterceptStream.CreateFromStream( hexDataContext.Stream, hexDataContext.SelectionStart, hexDataContext.SelectionLength); sr = new StreamReader(sourceStream); ClipBoardService.SetDataObject(sr.ReadToEnd()); } catch (Exception ex) { LoggerService.WriteCallerLine(ex.Message); MsgBoxService.Current?.Show($"{ex.Message}"); } finally { sourceStream?.Dispose(); sr?.Dispose(); } }); return(copyToClipBoardCommand); }
internal static IDelegateCommand CreateCopyToNewFileCommand(IHexDataContext hexDataContext) { var copyToNewFileCommand = CommandFactory.CreateDelegateCommand( () => { if (hexDataContext.SelectionLength == -1 || hexDataContext.SelectionStart == -1) { return; } var dialogService = ServiceProvider.Current.GetInstance <IDialogService>(); if (dialogService == null) { LoggerService.WriteCallerLine($"{nameof(dialogService)} can't be null."); return; } var path = dialogService.GetSaveFilePath(); if (path == null) { return; } var dialog = dialogService.CreateLoadingDialog(); dialog.WindowTitle = LanguageService.FindResourceString(Constants.WindowTitle_DataCopying); dialog.DoWork += (sender, e) => { FileStream fs = null; InterceptStream sourceStream = null; try { fs = File.Create(path); byte[] buffer = new byte[10485760]; int read; long readSize = 0; hexDataContext.Stream.Position = hexDataContext.SelectionStart; sourceStream = InterceptStream.CreateFromStream( hexDataContext.Stream, hexDataContext.SelectionStart, hexDataContext.SelectionLength); while ((read = sourceStream.Read(buffer, 0, buffer.Length)) != 0 && !dialog.CancellationPending) { fs.Write(buffer, 0, read); readSize += read; dialog.ReportProgress((int)(readSize * 100 / sourceStream.Length)); } } catch (Exception ex) { LoggerService.WriteCallerLine(ex.Message); } finally { fs?.Dispose(); sourceStream?.Dispose(); } }; dialog.RunWorkerCompleted += (sender, e) => { if (e.Cancelled) { return; } LocalExplorerService.OpenFolderAndSelectFile(path); MsgBoxService.Current?.Show(LanguageService.Current?.FindResourceString(Constants.WindowTitle_DataCopyDone)); }; dialog.ShowDialog(); }, () => SelectionAvailable(hexDataContext)); hexDataContext.SelectionStateChanged += delegate { copyToNewFileCommand.RaiseCanExecuteChanged(); }; return(copyToNewFileCommand); }