IFileSystem y Paths.FileSystem

Resumen

IFileSystem es una abstracción del sistema de archivos usada en todo StockSharp. En lugar de acceder directamente a System.IO.File y System.IO.Directory, los componentes de la plataforma trabajan mediante esta interfaz. Esto proporciona:

  • Testabilidad -- la posibilidad de sustituir el sistema de archivos en pruebas unitarias
  • Portabilidad -- una interfaz unificada para distintos entornos (disco local, almacenamiento en la nube, memoria)
  • Consistencia -- todos los componentes usan el mismo enfoque para trabajar con archivos

La interfaz IFileSystem se define en el paquete Ecng.Common y proporciona métodos para trabajar con archivos y directorios: creación, lectura, escritura, eliminación, comprobación de existencia y enumeración de archivos.

Paths.FileSystem

La clase Paths (namespace StockSharp.Configuration) proporciona la propiedad estática FileSystem: la implementación predeterminada de IFileSystem:

public static class Paths
{
    // Standard file system (LocalFileSystem)
    public static readonly IFileSystem FileSystem = Messages.Extensions.DefaultFileSystem;
}

Paths.FileSystem referencia LocalFileSystem.Instance, un singleton que trabaja con el disco local mediante las capacidades estándar de System.IO.

Métodos principales de IFileSystem

La interfaz IFileSystem incluye métodos para operaciones típicas:

Método Descripción
FileExists(path) Comprobar si existe un archivo
DirectoryExists(path) Comprobar si existe un directorio
CreateDirectory(path) Crear un directorio
OpenRead(path) Abrir un archivo para lectura (Stream)
OpenWrite(path) Abrir un archivo para escritura (Stream)
MoveFile(src, dst) Mover un archivo
DeleteFile(path) Eliminar un archivo
EnumerateFiles(path, mask) Enumerar archivos en un directorio
WriteAllTextAsync(path, text) Escribir texto en un archivo de forma asíncrona

Dónde se usa

Prácticamente todos los componentes de StockSharp que trabajan con el sistema de archivos aceptan IFileSystem en su constructor. A continuación se muestran los casos más comunes.

LocalMarketDataDrive

Almacenamiento local de datos de mercado en disco:

using StockSharp.Algo.Storages;
using StockSharp.Configuration;

// Forma recomendada -- pasar IFileSystem explícitamente
var drive = new LocalMarketDataDrive(Paths.FileSystem, @"C:\MarketData");

// Forma obsoleta (usa Paths.FileSystem internamente)
// var drive = new LocalMarketDataDrive(@"C:\MarketData"); // [Obsolete]

CsvEntityRegistry

Registro de entidades (exchanges, instrumentos, portfolios) en formato CSV:

using StockSharp.Algo.Storages.Csv;
using StockSharp.Configuration;

var executor = new ChannelExecutor();
var registry = new CsvEntityRegistry(Paths.FileSystem, @"C:\Data", executor);

SnapshotRegistry

Registro de snapshots de datos de mercado:

using StockSharp.Algo.Storages;
using StockSharp.Configuration;

var snapshots = new SnapshotRegistry(Paths.FileSystem, Paths.SnapshotsDir);

Serialización y deserialización

Métodos de extensión en Paths para trabajar con configuraciones JSON:

using StockSharp.Configuration;

var fs = Paths.FileSystem;

// Serializar objeto a un archivo
settings.Serialize(fs, @"C:\config.json");

// Deserializar objeto desde un archivo
var loaded = @"C:\config.json".Deserialize<SettingsStorage>(fs);

// Deserialización asíncrona
var data = await @"C:\data.json".DeserializeAsync<MyData>(fs, cancellationToken);

// Comprobar si existe un archivo de configuración
if (@"C:\config.json".IsConfigExists(fs))
{
    // ...
}

CandlePatternFileStorage

Almacenamiento de patrones de velas:

using StockSharp.Algo.Candles.Patterns;
using StockSharp.Configuration;

var patternStorage = new CandlePatternFileStorage(
    Paths.FileSystem,
    Paths.CandlePatternsFile,
    executor
);

NativeIdStorage, SecurityMappingStorage y otros

La mayoría de los almacenamientos de mapeos e identificadores también aceptan 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);

Patrón de uso típico

En aplicaciones StockSharp, se recomienda conservar una referencia a IFileSystem y pasarla a todos los componentes:

using StockSharp.Algo;
using StockSharp.Algo.Storages;
using StockSharp.Configuration;

// Obtener sistema de archivos
var fs = Paths.FileSystem;

// Crear almacenamiento de datos
var drive = new LocalMarketDataDrive(fs, Paths.StorageDir);

// Crear conector y configurar almacenamiento
var connector = new Connector();
connector.Adapter.StorageSettings.Drive = drive;

// Cargar ajustes desde archivo
var configFile = Path.Combine(Paths.AppDataPath, "connector_config.json");

if (configFile.IsConfigExists(fs))
{
    var config = configFile.Deserialize<SettingsStorage>(fs);
    connector.Load(config);
}

Sobrecargas obsoletas

Muchas clases conservan constructores sin IFileSystem por compatibilidad hacia atrás, pero están marcados con el atributo [Obsolete]. Estos constructores usan Paths.FileSystem internamente:

// Forma obsoleta
[Obsolete("Use IFileSystem overload.")]
public LocalMarketDataDrive(string path)
    : this(Paths.FileSystem, path) { }

// Forma recomendada
public LocalMarketDataDrive(IFileSystem fileSystem, string path) { }

Se recomienda usar siempre las sobrecargas con paso explícito de IFileSystem, ya que los constructores obsoletos se eliminarán en versiones futuras.