public ImageDetail DeriveManipulatedImage(string relativePath, string originalExtension, Manipulation imageManipulation) { var derivedFileName = imageManipulation.GetDerivedFileName(relativePath); var mimeType = GetMimeType(Path.GetExtension(relativePath)); if (!String.IsNullOrWhiteSpace(originalExtension)) { relativePath = ReplaceExtension(relativePath, originalExtension); } var originPath = Path.Combine(this.SourceDirectory, relativePath); if (System.IO.File.Exists(originPath)) { var newFileDirectory = Path.Combine(this.DerivedDirectory, relativePath); var newFilePath = Path.Combine(newFileDirectory, derivedFileName); var derivedFolderCreated = new DirectoryInfo(newFileDirectory).CreationTime; var originalFileModified = new FileInfo(originPath).LastWriteTime; if (Directory.Exists(newFileDirectory) && (originalFileModified > derivedFolderCreated)) { Directory.Delete(newFileDirectory, true); } if (File.Exists(newFilePath)) { return(new ImageDetail(newFilePath, mimeType)); } if (!Directory.Exists(newFileDirectory)) { Directory.CreateDirectory(newFileDirectory); } imageManipulation.Manipulate(originPath, newFilePath); return(new ImageDetail(newFilePath, mimeType)); } throw new FileNotFoundException(); }