/// <summary> /// Move the file specified in the path to the incoming folder so that it will be imported again /// </summary> /// <param name="path"></param> private void MoveFileToIncomingFolder(string path) { Platform.Log(LogLevel.Debug, "Moving file {0} to incoming folder", path); // should not proceed because it may mean incomplete study if (!File.Exists(path)) throw new FileNotFoundException(string.Format("File is missing: {0}", path)); // move the file to the Incoming folder to reprocess using (var processor = new ServerCommandProcessor("Move file back to incoming folder")) { var fileInfo = new FileInfo(path); var incomingPath = GetServerPartitionIncomingFolder(); incomingPath = Path.Combine(incomingPath, "FromWorkQueue"); incomingPath = Path.Combine(incomingPath, StorageLocation.StudyInstanceUid); var createDirCommand = new CreateDirectoryCommand(incomingPath); processor.AddCommand(createDirCommand); incomingPath = Path.Combine(incomingPath, fileInfo.Name); var move = new RenameFileCommand(path, incomingPath, true); processor.AddCommand(move); if (!processor.Execute()) { throw new Exception("Unexpected error happened when trying to move file back to the incoming folder for reprocess", processor.FailureException); } Platform.Log(LogLevel.Info, "File {0} has been moved to the incoming folder.", path); } }
/// <summary> /// Inserts a <see cref="StudyIntegrityQueue"/> entry for manual reconciliation. /// </summary> /// <param name="file">The DICOM file that needs to be reconciled.</param> /// <param name="reason">The type of <see cref="StudyIntegrityQueue"/> entry to be inserted.</param> /// <param name="uid">A UID to delete on insert.</param> /// <remarks> /// A copy of the DICOM file will be stored in a special folder allocated for /// reconciliation purpose. The caller is responsible for managing the original copy. /// </remarks> public void ScheduleReconcile(DicomFile file, StudyIntegrityReasonEnum reason, WorkQueueUid uid) { Platform.CheckForNullReference(_context.StudyLocation, "_context.StudyLocation"); Platform.Log(LogLevel.Info, "Scheduling new manual reconciliation for SOP {0}", file.MediaStorageSopInstanceUid); ServerFilesystemInfo fs = FilesystemMonitor.Instance.GetFilesystemInfo(_context.StudyLocation.FilesystemKey); Platform.CheckForNullReference(fs, "fs"); ReconcileStorage reconcileStorage = new ReconcileStorage(_context.StudyLocation, _context.Group); using(ServerCommandProcessor processor = new ServerCommandProcessor("Schedule Manual Reconciliation")) { string path = reconcileStorage.GetSopInstancePath(file.DataSet[DicomTags.SopInstanceUid].ToString()); DirectoryInfo dir = new DirectoryInfo(path); if (dir.Parent != null) { CreateDirectoryCommand mkdir = new CreateDirectoryCommand(dir.Parent.FullName); processor.AddCommand(mkdir); } SaveDicomFileCommand saveFileCommand = new SaveDicomFileCommand(path, file, true); processor.AddCommand(saveFileCommand); InsertSIQCommand updateStudyCommand = new InsertSIQCommand(_context.StudyLocation, reason, file, _context.Group, reconcileStorage); processor.AddCommand(updateStudyCommand); if (uid != null) processor.AddCommand(new DeleteWorkQueueUidCommand(uid)); if (processor.Execute() == false) { throw new ApplicationException(String.Format("Unable to schedule image reconcilation : {0}", processor.FailureReason), processor.FailureException); } } }