public async Task DeleteVideo(Guid id) { var video = await _catalogDb.Videos.FirstOrDefaultAsync(v => v.Id == id); if (video != null) { if (video.Status != Status.Converted) { throw new Exception("Video can be deleted only after converting finished."); } var dir = new DirectoryInfo(_fileStorageSettings.Path); foreach (var file in dir.EnumerateFiles(id.ToString("N") + ".*")) { file.Delete(); } var hlsDir = new DirectoryInfo(Path.Combine(_fileStorageSettings.Path, "hls", id.ToString("N"))); if (hlsDir.Exists) { hlsDir.Delete(true); } if (video.ImageFileName != null) { var imgDirectoryPath = Path.Combine(_fileStorageSettings.Path, "images"); var imgDirectory = new DirectoryInfo(imgDirectoryPath); if (!imgDirectory.Exists) { imgDirectory.Create(); } foreach (var oldFile in imgDirectory.EnumerateFiles(id.ToString("N") + ".*")) { oldFile.Delete(); } } var userVideos = await _catalogDb.UserVideoLists.Where(uvl => uvl.Video.Id == video.Id).ToListAsync(); var userProgresses = await _catalogDb.UserVideoProgresses.Where(uvp => uvp.Video.Id == video.Id).ToListAsync(); _catalogDb.RemoveRange(userVideos); _catalogDb.RemoveRange(userProgresses); _catalogDb.Remove(video); await _catalogDb.SaveChangesAsync(); } }