Files
GSS2Rework/GSS2.Core/ImageStorageService.cs
T
amkovkov 3cc4d21947 feat: massive rework
1) GSS2.Core:
- strip prefixes in GSS2.Core.Analysis.AmineContent namespace class names
- add IEnumerable<double>.Variance extension
- remake analysis + update database so not needed to store all every file, calibration data also stored in database, also currently capturing images stored in system temporary directory and rewriting every time
2) GSS.UI.Core: AsyncImageRecordViewModel make zoom and pans public
3) GSS:
- remove image-storage-clear command
- remove ResultsView and ResultsViewModel, results presented in analysis
- rework calibration views
- add analysis views
- add text and number fields editors view
- add confirmation view on danger buttons
2026-05-13 12:56:32 +03:00

114 lines
3.6 KiB
C#

using Microsoft.Extensions.Logging;
namespace GSS2.Core;
public class ImageStorageService
{
private readonly ILogger<ImageStorageService> _logger;
private readonly DirectoryInfo _rootDirectory;
public ImageStorageService(ILogger<ImageStorageService> logger, DirectoryInfo rootDirectory)
{
_logger = logger;
_logger.LogInformation("Инициализация");
_rootDirectory = rootDirectory;
if (!_rootDirectory.Exists)
{
_rootDirectory.Create();
_logger.LogInformation("Создана директория: {}", _rootDirectory.FullName);
}
_logger.LogInformation("Инициализировано");
}
public async Task<string> SaveAsync(Stream fileStream, string extension, string subDirectory, CancellationToken cancellationToken = default)
{
var fileName = GenerateFileName(extension);
var fullPath = GetFullPath(fileName, subDirectory);
System.Diagnostics.Debug.Assert(fullPath is not null);
var directory = Path.GetDirectoryName(fullPath)!;
Directory.CreateDirectory(directory);
await using var file = new FileStream(
fullPath,
FileMode.CreateNew,
FileAccess.Write,
FileShare.None,
81920,
useAsync: true);
await fileStream.CopyToAsync(file, cancellationToken);
_logger.LogInformation("Файл сохранён: {}", fileName);
return fileName;
}
public Stream OpenRead(string fileName, string? subDirectory = null)
{
var fullPath = GetFullPath(fileName, subDirectory);
if (fullPath is null)
throw new FileNotFoundException(null, fullPath);
return new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
public bool Delete(string fileName, string? subDirectory = null)
{
var fullPath = GetFullPath(fileName, subDirectory);
if (fullPath is null)
throw new FileNotFoundException(null, fullPath);
if (!File.Exists(fullPath))
return false;
File.Delete(fullPath);
_logger.LogInformation("Файл удалён: {}", fileName);
var parentDirectory = Directory.GetParent(fullPath);
if (parentDirectory?.GetFiles().Count() == 0)
{
parentDirectory.Delete();
_logger.LogInformation("Удалена пустая директория: {}", parentDirectory.Name);
}
return true;
}
private string GenerateFileName(string extension)
{
var guid = Guid.NewGuid().ToString("N");
return $"{guid}{extension}";
}
public string? GetFullPath(string fileName, string? subDirectory = null)
{
if (fileName.Count() < 4)
return null;
var level1 = fileName.Substring(0, 2);
var level2 = fileName.Substring(2, 2);
if (subDirectory is not null)
return Path.Combine(_rootDirectory.FullName, subDirectory, level1, level2, fileName);
return ListFiles()
.FirstOrDefault(f => Path.GetFileName(f) == fileName);
}
public List<string> ListFiles(string? subDirectory = null)
{
if (subDirectory is not null)
return Directory.GetDirectories(Path.Join(_rootDirectory.FullName, subDirectory))
.SelectMany(Directory.GetDirectories)
.SelectMany(Directory.GetFiles)
.ToList();
return Directory.GetDirectories(_rootDirectory.FullName)
.Select(Path.GetFileName)
.SelectMany(ListFiles)
.ToList();
}
}