forked from amkovkov/GranuSightSoftware2
110 lines
3.4 KiB
C#
110 lines
3.4 KiB
C#
using Microsoft.Extensions.Logging;
|
|
|
|
namespace GSS2.Core.Hardware;
|
|
|
|
public class ImageStorageService
|
|
{
|
|
private readonly ILogger<ImageStorageService> _logger;
|
|
private readonly DirectoryInfo _rootDirectory;
|
|
|
|
public ImageStorageService(ILogger<ImageStorageService> logger, DirectoryInfo rootDirectory)
|
|
{
|
|
_logger = logger;
|
|
_logger.LogInformation("Initialization");
|
|
|
|
_rootDirectory = rootDirectory;
|
|
if (!_rootDirectory.Exists)
|
|
{
|
|
_rootDirectory.Create();
|
|
_logger.LogInformation("Created directory: {}", _rootDirectory.FullName);
|
|
}
|
|
|
|
_logger.LogInformation("Initialized");
|
|
}
|
|
|
|
public async Task<string> SaveAsync(Stream fileStream, string extension, string subDirectory, CancellationToken ct = 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, ct);
|
|
|
|
_logger.LogInformation("File saved: {FileName}", 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("File removed: {}", fileName);
|
|
|
|
var parentDirectory = Directory.GetParent(fullPath);
|
|
if (parentDirectory?.GetFiles().Count() == 0)
|
|
{
|
|
parentDirectory.Delete();
|
|
_logger.LogInformation("Empty directory removed: {}", 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)
|
|
{
|
|
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();
|
|
}
|
|
} |