private bool InternalExecute() { AddOutputMessage($"Operation {Title} started"); StartTime = DateTime.UtcNow; OperationStatus = FileOperationStatus.InProgress; if (!(Source is MediaBase source)) { return(false); } switch (Kind) { case TFileOperationKind.None: return(true); case TFileOperationKind.Ingest: case TFileOperationKind.Export: throw new InvalidOperationException("Invalid operation kind"); case TFileOperationKind.Copy: if (!File.Exists(source.FullPath) || !Directory.Exists(DestDirectory.Folder)) { return(false); } try { lock (_destMediaLock) { CreateDestMediaIfNotExists(); if (!(Dest.FileExists() && File.GetLastWriteTimeUtc(source.FullPath).Equals(File.GetLastWriteTimeUtc(Dest.FullPath)) && File.GetCreationTimeUtc(source.FullPath).Equals(File.GetCreationTimeUtc(Dest.FullPath)) && Source.FileSize.Equals(Dest.FileSize))) { Dest.MediaStatus = TMediaStatus.Copying; IsIndeterminate = true; if (!source.CopyMediaTo(Dest, ref Aborted)) { return(false); } } Dest.MediaStatus = TMediaStatus.Copied; ThreadPool.QueueUserWorkItem(o => Dest.Verify()); AddOutputMessage($"Copy operation {Title} finished"); return(true); } } catch (Exception e) { AddOutputMessage($"Copy operation {Title} failed with {e.Message}"); } return(false); case TFileOperationKind.Delete: try { if (Source.Delete()) { AddOutputMessage($"Delete operation {Title} finished"); return(true); } } catch (Exception e) { AddOutputMessage($"Delete operation {Title} failed with {e.Message}"); } return(false); case TFileOperationKind.Move: if (!File.Exists(source.FullPath) || !Directory.Exists(DestDirectory.Folder)) { return(false); } try { CreateDestMediaIfNotExists(); if (Dest.FileExists()) { if (File.GetLastWriteTimeUtc(source.FullPath).Equals(File.GetLastWriteTimeUtc(Dest.FullPath)) && File.GetCreationTimeUtc(source.FullPath).Equals(File.GetCreationTimeUtc(Dest.FullPath)) && source.FileSize.Equals(Dest.FileSize)) { source.Delete(); return(true); } else if (!Dest.Delete()) { AddOutputMessage("Move operation failed - destination media not deleted"); return(false); } } IsIndeterminate = true; Dest.MediaStatus = TMediaStatus.Copying; FileUtils.CreateDirectoryIfNotExists(Path.GetDirectoryName(Dest.FullPath)); File.Move(source.FullPath, Dest.FullPath); File.SetCreationTimeUtc(Dest.FullPath, File.GetCreationTimeUtc(source.FullPath)); File.SetLastWriteTimeUtc(Dest.FullPath, File.GetLastWriteTimeUtc(source.FullPath)); Dest.MediaStatus = TMediaStatus.Copied; ThreadPool.QueueUserWorkItem(o => Dest.Verify()); AddOutputMessage("Move operation finished"); Debug.WriteLine(this, "File operation succeed"); return(true); } catch (Exception e) { AddOutputMessage($"Move operation {Title} failed with {e.Message}"); } return(false); default: return(false); } }