using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Teknik.Configuration; using Teknik.Utilities; using Teknik.Utilities.Cryptography; namespace Teknik.StorageService { public class LocalStorageService : StorageService { public LocalStorageService(StorageConfig config) : base(config) { } public override string GetUniqueFileName() { string filePath = FileHelper.GenerateRandomFileName(_config.LocalDirectory, _config.FileExtension, _config.FileNameLength); return Path.GetFileName(filePath); } public override List GetFileNames() { return Directory.GetFiles(_config.LocalDirectory, "*.*", SearchOption.AllDirectories).Select(f => Path.GetFileName(f).ToLower()).ToList(); } public override Stream GetFile(string fileName) { if (string.IsNullOrEmpty(fileName)) return null; string filePath = GetFilePath(fileName); if (File.Exists(filePath)) return new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); return null; } public override async Task SaveEncryptedFile(string fileName, Stream file, byte[] key, byte[] iv) { if (!Directory.Exists(_config.LocalDirectory)) Directory.CreateDirectory(_config.LocalDirectory); string filePath = GetFilePath(fileName); await AesCounterManaged.EncryptToFile(file, filePath, key, iv); } public override async Task SaveFile(string fileName, Stream file) { if (!Directory.Exists(_config.LocalDirectory)) Directory.CreateDirectory(_config.LocalDirectory); string filePath = GetFilePath(fileName); // Just write the stream to the file using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { file.Seek(0, SeekOrigin.Begin); await file.CopyToAsync(fileStream); } } public override void DeleteFile(string fileName) { string filePath = GetFilePath(fileName); // Delete the File if (File.Exists(filePath)) { File.Delete(filePath); } } private string GetFilePath(string fileName) { if (string.IsNullOrEmpty(fileName)) return null; string subDir = fileName[0].ToString().ToLower(); return Path.Combine(_config.LocalDirectory, subDir, fileName); } } }