diff --git a/AsbCloudApp/Repositories/IFileStorageRepository.cs b/AsbCloudApp/Repositories/IFileStorageRepository.cs index ce5d693b..b8b7b482 100644 --- a/AsbCloudApp/Repositories/IFileStorageRepository.cs +++ b/AsbCloudApp/Repositories/IFileStorageRepository.cs @@ -11,6 +11,7 @@ namespace AsbCloudApp.Repositories /// public interface IFileStorageRepository { + /// /// Получение длинны фала и проверка его наличия, если отсутствует падает исключение /// @@ -35,10 +36,16 @@ namespace AsbCloudApp.Repositories Task SaveFileAsync(string filePathRec, Stream fileStreamSrc, CancellationToken token); /// - /// Удаление файла + /// Удаление пачки файлов /// /// - void DeleteFile(IEnumerable filesName); + void DeleteFiles(IEnumerable filesName); + + /// + /// Удаление одного файла + /// + /// + void DeleteFile(string fileName); /// /// Удаление всех файлов с диска о которых нет информации в базе @@ -55,7 +62,7 @@ namespace AsbCloudApp.Repositories IEnumerable GetListFilesNotDisc(IEnumerable files); /// - /// Получение пути к файлу + /// Создание пути для сохранения файла связанного со скважиной /// /// /// @@ -63,15 +70,34 @@ namespace AsbCloudApp.Repositories /// /// string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId); + + /// + /// Создание пути для сохранения файла + /// + /// + /// + /// + /// + string MakeFilePath(string path1, string path2, string path3); /// - /// Получить путь для скачивания + /// Получение пути к файлу связанного со скважиной /// /// /// /// - /// + /// /// - string GetUrl(int idWell, int idCategory, int idFile, string dotExtention); + string GetFilePath(int idWell, int idCategory, int idFile, string dotExtenstion); + + /// + /// Получение пути файла лежащего на диске + /// + /// + /// + /// + /// + /// + string GetFilePath(string path1, string path2, int idFile, string dotExtenstion); } } diff --git a/AsbCloudApp/Services/FileService.cs b/AsbCloudApp/Services/FileService.cs index 54853b51..0513881b 100644 --- a/AsbCloudApp/Services/FileService.cs +++ b/AsbCloudApp/Services/FileService.cs @@ -121,7 +121,7 @@ namespace AsbCloudApp.Services return 0; var filesName = files.Select(x => GetUrl(x.IdWell, x.IdCategory, x.Id, Path.GetExtension(x.Name))); - fileStorageRepository.DeleteFile(filesName); + fileStorageRepository.DeleteFiles(filesName); return files.Any() ? 1 : 0; } @@ -143,7 +143,7 @@ namespace AsbCloudApp.Services /// /// public string GetUrl(int idWell, int idCategory, int idFile, string dotExtention) => - fileStorageRepository.GetUrl(idWell, idCategory, idFile, dotExtention); + fileStorageRepository.GetFilePath(idWell, idCategory, idFile, dotExtention); /// /// пометить метку файла как удаленную diff --git a/AsbCloudInfrastructure/Repository/FileStorageRepository.cs b/AsbCloudInfrastructure/Repository/FileStorageRepository.cs index 94c932db..4af6aa09 100644 --- a/AsbCloudInfrastructure/Repository/FileStorageRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileStorageRepository.cs @@ -6,116 +6,126 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace AsbCloudInfrastructure.Repository +namespace AsbCloudInfrastructure.Repository; + +public class FileStorageRepository : IFileStorageRepository { + /// + /// Директория хранения файлов + /// + private readonly string RootPath = "files"; - public class FileStorageRepository : IFileStorageRepository + public FileStorageRepository() { - /// - /// Директория хранения файлов - /// - private readonly string RootPath = "files"; + } - public FileStorageRepository() + public async Task SaveFileAsync(string filePathRec, Stream fileStreamSrc, CancellationToken token) + { + CreateDirectory(filePathRec); + using var newfileStream = new FileStream(filePathRec, FileMode.Create); + await fileStreamSrc.CopyToAsync(newfileStream, token).ConfigureAwait(false); + } + + public void DeleteFiles(IEnumerable filesName) + { + foreach (var fileName in filesName) { - } - - public async Task SaveFileAsync(string filePathRec, Stream fileStreamSrc, CancellationToken token) - { - CreateDirectory(filePathRec); - using var newfileStream = new FileStream(filePathRec, FileMode.Create); - await fileStreamSrc.CopyToAsync(newfileStream, token).ConfigureAwait(false); - } - - public void DeleteFile(IEnumerable filesName) - { - foreach (var fileName in filesName) - { - if (File.Exists(fileName)) - File.Delete(fileName); - } - } - - public long GetFileLength(string srcFilePath) - { - var sysFileInfo = new FileInfo(srcFilePath); - return sysFileInfo.Length; - } - - public void MoveFile(string srcFilePath, string filePath) - { - CreateDirectory(filePath); - File.Move(srcFilePath, filePath); - } - - public string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId) - { - return Path.Combine(RootPath, $"{idWell}", - $"{idCategory}", $"{fileId}" + $"{Path.GetExtension(fileFullName)}"); - } - - public int DeleteFilesNotInList(int idWell, IEnumerable idsFilesList) - { - var allFilesPath = GetFilesPath(idWell); - var result = 0; - - foreach (var filePath in allFilesPath) - { - if (int.TryParse(Path.GetFileNameWithoutExtension(filePath), out int idFile) - || !idsFilesList.Any(x => x == idFile)) - { - File.Delete(filePath); - result++; - } - } - - return result; - } - - public IEnumerable GetListFilesNotDisc(IEnumerable files) - { - var resutl = new List(); - var groupFiles = files.GroupBy(x => x.IdWell); - - foreach (var itemGroupFiles in groupFiles) - { - var idsFilesStorage = GetIdsFiles(itemGroupFiles.Key); - foreach (var file in files) - { - if (!idsFilesStorage.Any(x => x == file.Id)) - resutl.Add(file); - } - } - - return resutl; - } - - public string GetUrl(int idWell, int idCategory, int idFile, string dotExtention) => - Path.Combine(RootPath, idWell.ToString(), idCategory.ToString(), $"{idFile}{dotExtention}"); - - private IEnumerable GetIdsFiles(int idWell) - { - var result = new List(); - var allFilesPath = GetFilesPath(idWell); - - foreach (var filePath in allFilesPath) - if(int.TryParse(Path.GetFileNameWithoutExtension(filePath), out int idFile)) - result.Add(idFile); - - return result; - } - - private IEnumerable GetFilesPath(int idWell) - { - var path = Path.Combine(RootPath, $"{idWell}"); - return Directory.GetFiles(path, "*.*", SearchOption.AllDirectories); - } - - private static void CreateDirectory(string filePath) - { - var directoryName = Path.GetDirectoryName(filePath)!; - Directory.CreateDirectory(directoryName); + DeleteFile(fileName); } } + public void DeleteFile(string fileName) + { + if (File.Exists(fileName)) + File.Delete(fileName); + } + + public long GetFileLength(string srcFilePath) + { + var sysFileInfo = new FileInfo(srcFilePath); + return sysFileInfo.Length; + } + + public void MoveFile(string srcFilePath, string filePath) + { + CreateDirectory(filePath); + File.Move(srcFilePath, filePath); + } + + public string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId) => + MakeFilePath($"{idWell}", + $"{idCategory}", + $"{fileId}" + $"{Path.GetExtension(fileFullName)}"); + + public string MakeFilePath(string path1, string path2, string path3) => + Path.Combine(RootPath, + path1, + path2, + path3); + + public int DeleteFilesNotInList(int idWell, IEnumerable idsFilesList) + { + var allFilesPath = GetFilesPath(idWell); + var result = 0; + + foreach (var filePath in allFilesPath) + { + if (int.TryParse(Path.GetFileNameWithoutExtension(filePath), out int idFile) + || !idsFilesList.Any(x => x == idFile)) + { + File.Delete(filePath); + result++; + } + } + + return result; + } + + public IEnumerable GetListFilesNotDisc(IEnumerable files) + { + var resutl = new List(); + var groupFiles = files.GroupBy(x => x.IdWell); + + foreach (var itemGroupFiles in groupFiles) + { + var idsFilesStorage = GetIdsFiles(itemGroupFiles.Key); + foreach (var file in files) + { + if (!idsFilesStorage.Any(x => x == file.Id)) + resutl.Add(file); + } + } + + return resutl; + } + + public string GetFilePath(int idWell, int idCategory, int idFile, string dotExtenstion) => + GetFilePath(idWell.ToString(), idCategory.ToString(), idFile, dotExtenstion); + + public string GetFilePath(string path1, string path2, int idFile, string dotExtenstion) => + Path.Combine(RootPath, path1, path2, $"{idFile}{dotExtenstion}"); + + private IEnumerable GetIdsFiles(int idWell) + { + var result = new List(); + var allFilesPath = GetFilesPath(idWell); + + foreach (var filePath in allFilesPath) + if (int.TryParse(Path.GetFileNameWithoutExtension(filePath), out int idFile)) + result.Add(idFile); + + return result; + } + + private IEnumerable GetFilesPath(int idWell) + { + var path = Path.Combine(RootPath, $"{idWell}"); + return Directory.GetFiles(path, "*.*", SearchOption.AllDirectories); + } + + private static void CreateDirectory(string filePath) + { + var directoryName = Path.GetDirectoryName(filePath)!; + Directory.CreateDirectory(directoryName); + } } diff --git a/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs index 9fb13366..707a3b50 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/FileServiceTest.cs @@ -128,7 +128,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests }); var storageRepositoryMock = new Mock(); - storageRepositoryMock.Setup(x => x.GetUrl(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + storageRepositoryMock.Setup(x => x.GetFilePath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns((int idWell, int idCategory, int idFile, string dotExtention) => { return Path.Combine("files", idWell.ToString(), idCategory.ToString(), $"{idFile}{dotExtention}"); });