/
rezvich
/
Prik
Обзор
Документация
Войти
/
rezvich
/
Prik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Infrastructure/Refs/RefFileResolver.cs
81 строка
2 KB
waweda299
Прик
08 июн 2026, 15:52
08 июн 2026, 15:52
9ddc25e
Код
Авторство
О чём код?
//prik/Infrastructure/Refs/RefFileResolver.cs using System.Text.RegularExpressions; namespace prik.Infrastructure.Refs { public sealed record ResolvedRefs(string NartanPath); public interface IRefFileResolver { ResolvedRefs Resolve(string refDir); } public sealed class RefFileResolver : IRefFileResolver { private static readonly Regex DateRe = new(@"(\d{2})(\d{2})(\d{4})", RegexOptions.Compiled); public ResolvedRefs Resolve(string refDir) { var nartan = FindLatestByMask(refDir, "Нартан_*.xlsx"); return new ResolvedRefs(nartan.FullName); } private static FileInfo FindLatestByMask(string folder, string mask) { var dir = new DirectoryInfo(folder); if (!dir.Exists) { throw new DirectoryNotFoundException(folder); } var files = dir.GetFiles(mask, SearchOption.TopDirectoryOnly); if (files.Length == 0) { throw new FileNotFoundException($"В папке {folder} не найдено файлов по маске: {mask}"); } // 1) по дате в имени var dated = files .Select(f => (f, d: ExtractDate(f))) .Where(x => x.d.HasValue) .ToList(); if (dated.Count > 0) { return dated.OrderByDescending(x => x.d!.Value).First().f; } // 2) fallback: по времени изменения return files.OrderByDescending(f => f.LastWriteTimeUtc).First(); } private static DateTime? ExtractDate(FileInfo f) { var stem = Path.GetFileNameWithoutExtension(f.Name); var m = DateRe.Match(stem); if (!m.Success) { return null; } if (!int.TryParse(m.Groups[1].Value, out var dd)) { return null; } if (!int.TryParse(m.Groups[2].Value, out var mm)) { return null; } if (!int.TryParse(m.Groups[3].Value, out var yyyy)) { return null; } try { return new DateTime(yyyy, mm, dd); } catch { return null; } } } }