IFileSystem и Paths.FileSystem
Обзор
IFileSystem -- абстракция файловой системы, используемая повсеместно в StockSharp. Вместо прямого обращения к System.IO.File и System.IO.Directory, компоненты платформы работают через этот интерфейс. Это обеспечивает:
- Тестируемость -- возможность подменить файловую систему в модульных тестах
- Переносимость -- единый интерфейс для разных сред (локальный диск, облачное хранилище, память)
- Единообразие -- все компоненты используют одинаковый подход к работе с файлами
Интерфейс IFileSystem определен в пакете Ecng.Common и предоставляет методы для работы с файлами и директориями: создание, чтение, запись, удаление, проверка существования, перечисление файлов.
Paths.FileSystem
Класс Paths (пространство имен StockSharp.Configuration) предоставляет статическое свойство FileSystem -- реализацию IFileSystem по умолчанию:
public static class Paths
{
// Стандартная файловая система (LocalFileSystem)
public static readonly IFileSystem FileSystem = Messages.Extensions.DefaultFileSystem;
}
Paths.FileSystem ссылается на LocalFileSystem.Instance -- синглтон, работающий с локальным диском через стандартные средства System.IO.
Основные методы IFileSystem
Интерфейс IFileSystem включает методы для типичных операций:
| Метод | Описание |
|---|---|
FileExists(path) |
Проверить существование файла |
DirectoryExists(path) |
Проверить существование директории |
CreateDirectory(path) |
Создать директорию |
OpenRead(path) |
Открыть файл для чтения (Stream) |
OpenWrite(path) |
Открыть файл для записи (Stream) |
MoveFile(src, dst) |
Переместить файл |
DeleteFile(path) |
Удалить файл |
EnumerateFiles(path, mask) |
Перечислить файлы в директории |
WriteAllTextAsync(path, text) |
Записать текст в файл асинхронно |
Где используется
Практически все компоненты StockSharp, работающие с файловой системой, принимают IFileSystem в конструкторе. Ниже приведены наиболее частые случаи.
LocalMarketDataDrive
Хранилище рыночных данных на локальном диске:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Рекомендуемый способ -- явная передача IFileSystem
var drive = new LocalMarketDataDrive(Paths.FileSystem, @"C:\MarketData");
// Устаревший способ (использует Paths.FileSystem внутри)
// var drive = new LocalMarketDataDrive(@"C:\MarketData"); // [Obsolete]
CsvEntityRegistry
Реестр сущностей (биржи, инструменты, портфели) в CSV-формате:
using StockSharp.Algo.Storages.Csv;
using StockSharp.Configuration;
var executor = new ChannelExecutor();
var registry = new CsvEntityRegistry(Paths.FileSystem, @"C:\Data", executor);
SnapshotRegistry
Реестр снимков рыночных данных:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
var snapshots = new SnapshotRegistry(Paths.FileSystem, Paths.SnapshotsDir);
Сериализация и десериализация
Методы расширения в Paths для работы с JSON-конфигурациями:
using StockSharp.Configuration;
var fs = Paths.FileSystem;
// Сериализовать объект в файл
settings.Serialize(fs, @"C:\config.json");
// Десериализовать объект из файла
var loaded = @"C:\config.json".Deserialize<SettingsStorage>(fs);
// Асинхронная десериализация
var data = await @"C:\data.json".DeserializeAsync<MyData>(fs, cancellationToken);
// Проверить существование конфигурационного файла
if (@"C:\config.json".IsConfigExists(fs))
{
// ...
}
CandlePatternFileStorage
Хранилище свечных паттернов:
using StockSharp.Algo.Candles.Patterns;
using StockSharp.Configuration;
var patternStorage = new CandlePatternFileStorage(
Paths.FileSystem,
Paths.CandlePatternsFile,
executor
);
NativeIdStorage, SecurityMappingStorage и другие
Большинство хранилищ маппингов и идентификаторов также принимают IFileSystem:
// NativeIdStorage
var nativeIdStorage = new NativeIdStorage(Paths.FileSystem, Paths.SecurityNativeIdDir, executor);
// SecurityMappingStorage
var mappingStorage = new SecurityMappingStorage(Paths.FileSystem, Paths.SecurityMappingDir, executor);
// ExtendedInfoStorage
var extInfoStorage = new ExtendedInfoStorage(Paths.FileSystem, Paths.SecurityExtendedInfo, executor);
Типичный паттерн использования
В приложениях StockSharp рекомендуется сохранять ссылку на IFileSystem и передавать ее во все компоненты:
using StockSharp.Algo;
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Получить файловую систему
var fs = Paths.FileSystem;
// Создать хранилище данных
var drive = new LocalMarketDataDrive(fs, Paths.StorageDir);
// Создать коннектор и настроить хранилище
var connector = new Connector();
connector.Adapter.StorageSettings.Drive = drive;
// Загрузить настройки из файла
var configFile = Path.Combine(Paths.AppDataPath, "connector_config.json");
if (configFile.IsConfigExists(fs))
{
var config = configFile.Deserialize<SettingsStorage>(fs);
connector.Load(config);
}
Устаревшие перегрузки
Многие классы сохраняют конструкторы без IFileSystem для обратной совместимости, но они помечены атрибутом [Obsolete]. Эти конструкторы используют Paths.FileSystem внутри:
// Устаревший способ
[Obsolete("Use IFileSystem overload.")]
public LocalMarketDataDrive(string path)
: this(Paths.FileSystem, path) { }
// Рекомендуемый способ
public LocalMarketDataDrive(IFileSystem fileSystem, string path) { }
Рекомендуется всегда использовать перегрузки с явной передачей IFileSystem, так как устаревшие конструкторы будут удалены в будущих версиях.