forked from ddrilling/AsbCloudServer
Мелкие фиксы репозитория хранения файлов.
This commit is contained in:
parent
6f05877ac9
commit
2769271583
@ -11,6 +11,7 @@ namespace AsbCloudApp.Repositories
|
||||
/// </summary>
|
||||
public interface IFileStorageRepository
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Получение длинны фала и проверка его наличия, если отсутствует падает исключение
|
||||
/// </summary>
|
||||
@ -35,10 +36,16 @@ namespace AsbCloudApp.Repositories
|
||||
Task SaveFileAsync(string filePathRec, Stream fileStreamSrc, CancellationToken token);
|
||||
|
||||
/// <summary>
|
||||
/// Удаление файла
|
||||
/// Удаление пачки файлов
|
||||
/// </summary>
|
||||
/// <param name="filesName"></param>
|
||||
void DeleteFile(IEnumerable<string> filesName);
|
||||
void DeleteFiles(IEnumerable<string> filesName);
|
||||
|
||||
/// <summary>
|
||||
/// Удаление одного файла
|
||||
/// </summary>
|
||||
/// <param name="fileName"></param>
|
||||
void DeleteFile(string fileName);
|
||||
|
||||
/// <summary>
|
||||
/// Удаление всех файлов с диска о которых нет информации в базе
|
||||
@ -55,7 +62,7 @@ namespace AsbCloudApp.Repositories
|
||||
IEnumerable<FileInfoDto> GetListFilesNotDisc(IEnumerable<FileInfoDto> files);
|
||||
|
||||
/// <summary>
|
||||
/// Получение пути к файлу
|
||||
/// Создание пути для сохранения файла связанного со скважиной
|
||||
/// </summary>
|
||||
/// <param name="idWell"></param>
|
||||
/// <param name="idCategory"></param>
|
||||
@ -63,15 +70,34 @@ namespace AsbCloudApp.Repositories
|
||||
/// <param name="fileId"></param>
|
||||
/// <returns></returns>
|
||||
string MakeFilePath(int idWell, int idCategory, string fileFullName, int fileId);
|
||||
|
||||
/// <summary>
|
||||
/// Создание пути для сохранения файла
|
||||
/// </summary>
|
||||
/// <param name="path1"></param>
|
||||
/// <param name="path2"></param>
|
||||
/// <param name="path3"></param>
|
||||
/// <returns></returns>
|
||||
string MakeFilePath(string path1, string path2, string path3);
|
||||
|
||||
/// <summary>
|
||||
/// Получить путь для скачивания
|
||||
/// Получение пути к файлу связанного со скважиной
|
||||
/// </summary>
|
||||
/// <param name="idWell"></param>
|
||||
/// <param name="idCategory"></param>
|
||||
/// <param name="idFile"></param>
|
||||
/// <param name="dotExtention"></param>
|
||||
/// <param name="dotExtenstion"></param>
|
||||
/// <returns></returns>
|
||||
string GetUrl(int idWell, int idCategory, int idFile, string dotExtention);
|
||||
string GetFilePath(int idWell, int idCategory, int idFile, string dotExtenstion);
|
||||
|
||||
/// <summary>
|
||||
/// Получение пути файла лежащего на диске
|
||||
/// </summary>
|
||||
/// <param name="path1"></param>
|
||||
/// <param name="path2"></param>
|
||||
/// <param name="idFile"></param>
|
||||
/// <param name="dotExtenstion"></param>
|
||||
/// <returns></returns>
|
||||
string GetFilePath(string path1, string path2, int idFile, string dotExtenstion);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
/// <param name="dotExtention"></param>
|
||||
/// <returns></returns>
|
||||
public string GetUrl(int idWell, int idCategory, int idFile, string dotExtention) =>
|
||||
fileStorageRepository.GetUrl(idWell, idCategory, idFile, dotExtention);
|
||||
fileStorageRepository.GetFilePath(idWell, idCategory, idFile, dotExtention);
|
||||
|
||||
/// <summary>
|
||||
/// пометить метку файла как удаленную
|
||||
|
@ -6,116 +6,126 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AsbCloudInfrastructure.Repository
|
||||
namespace AsbCloudInfrastructure.Repository;
|
||||
|
||||
public class FileStorageRepository : IFileStorageRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// Директория хранения файлов
|
||||
/// </summary>
|
||||
private readonly string RootPath = "files";
|
||||
|
||||
public class FileStorageRepository : IFileStorageRepository
|
||||
public FileStorageRepository()
|
||||
{
|
||||
/// <summary>
|
||||
/// Директория хранения файлов
|
||||
/// </summary>
|
||||
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<string> 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<string> 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<int> 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<FileInfoDto> GetListFilesNotDisc(IEnumerable<FileInfoDto> files)
|
||||
{
|
||||
var resutl = new List<FileInfoDto>();
|
||||
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<int> GetIdsFiles(int idWell)
|
||||
{
|
||||
var result = new List<int>();
|
||||
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<string> 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<int> 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<FileInfoDto> GetListFilesNotDisc(IEnumerable<FileInfoDto> files)
|
||||
{
|
||||
var resutl = new List<FileInfoDto>();
|
||||
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<int> GetIdsFiles(int idWell)
|
||||
{
|
||||
var result = new List<int>();
|
||||
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<string> 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);
|
||||
}
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests
|
||||
});
|
||||
|
||||
var storageRepositoryMock = new Mock<IFileStorageRepository>();
|
||||
storageRepositoryMock.Setup(x => x.GetUrl(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>()))
|
||||
storageRepositoryMock.Setup(x => x.GetFilePath(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>()))
|
||||
.Returns((int idWell, int idCategory, int idFile, string dotExtention) => {
|
||||
return Path.Combine("files", idWell.ToString(), idCategory.ToString(), $"{idFile}{dotExtention}");
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user