IFileSystem e Paths.FileSystem
Visão geral
IFileSystem é uma abstração do sistema de ficheiros utilizada em todo o StockSharp. Em vez de aceder diretamente a System.IO.File e System.IO.Directory, os componentes da plataforma trabalham através desta interface. Isto proporciona:
- Testabilidade -- a capacidade de substituir o sistema de ficheiros em testes unitários
- Portabilidade -- uma interface unificada para diferentes ambientes (disco local, armazenamento na cloud, memória)
- Consistência -- todos os componentes utilizam a mesma abordagem para trabalhar com ficheiros
A interface IFileSystem está definida no pacote Ecng.Common e fornece métodos para trabalhar com ficheiros e diretórios: criação, leitura, escrita, eliminação, verificação de existência e enumeração de ficheiros.
Paths.FileSystem
A classe Paths (namespace StockSharp.Configuration) fornece a propriedade estática FileSystem -- a implementação predefinida de IFileSystem:
public static class Paths
{
// Standard file system (LocalFileSystem)
public static readonly IFileSystem FileSystem = Messages.Extensions.DefaultFileSystem;
}
Paths.FileSystem referencia LocalFileSystem.Instance -- um singleton que trabalha com o disco local através dos recursos padrão de System.IO.
Principais métodos de IFileSystem
A interface IFileSystem inclui métodos para operações típicas:
| Método | Descrição |
|---|---|
FileExists(path) |
Verificar se um ficheiro existe |
DirectoryExists(path) |
Verificar se um diretório existe |
CreateDirectory(path) |
Criar um diretório |
OpenRead(path) |
Abrir um ficheiro para leitura (Stream) |
OpenWrite(path) |
Abrir um ficheiro para escrita (Stream) |
MoveFile(src, dst) |
Mover um ficheiro |
DeleteFile(path) |
Eliminar um ficheiro |
EnumerateFiles(path, mask) |
Enumerar ficheiros num diretório |
WriteAllTextAsync(path, text) |
Escrever texto num ficheiro de forma assíncrona |
Onde é utilizado
Praticamente todos os componentes StockSharp que trabalham com o sistema de ficheiros aceitam IFileSystem no respetivo construtor. Abaixo estão os casos mais comuns.
LocalMarketDataDrive
Armazenamento de dados de mercado em disco local:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Forma recomendada -- passar IFileSystem explicitamente
var drive = new LocalMarketDataDrive(Paths.FileSystem, @"C:\MarketData");
// Forma obsoleta (usa Paths.FileSystem internamente)
// var drive = new LocalMarketDataDrive(@"C:\MarketData"); // [Obsolete]
CsvEntityRegistry
Registo de entidades (bolsas, instrumentos, carteiras) em formato CSV:
using StockSharp.Algo.Storages.Csv;
using StockSharp.Configuration;
var executor = new ChannelExecutor();
var registry = new CsvEntityRegistry(Paths.FileSystem, @"C:\Data", executor);
SnapshotRegistry
Registo de snapshots de dados de mercado:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
var snapshots = new SnapshotRegistry(Paths.FileSystem, Paths.SnapshotsDir);
Serialização e desserialização
Métodos de extensão em Paths para trabalhar com configurações JSON:
using StockSharp.Configuration;
var fs = Paths.FileSystem;
// Serializar objeto para um arquivo
settings.Serialize(fs, @"C:\config.json");
// Desserializar objeto de um arquivo
var loaded = @"C:\config.json".Deserialize<SettingsStorage>(fs);
// Desserialização assíncrona
var data = await @"C:\data.json".DeserializeAsync<MyData>(fs, cancellationToken);
// Verificar se um arquivo de configuração existe
if (@"C:\config.json".IsConfigExists(fs))
{
// ...
}
CandlePatternFileStorage
Armazenamento de padrões de candles:
using StockSharp.Algo.Candles.Patterns;
using StockSharp.Configuration;
var patternStorage = new CandlePatternFileStorage(
Paths.FileSystem,
Paths.CandlePatternsFile,
executor
);
NativeIdStorage, SecurityMappingStorage e outros
A maioria dos armazenamentos de mapeamento e identificadores também aceita 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);
Padrão típico de utilização
Em aplicações StockSharp, recomenda-se manter uma referência a IFileSystem e passá-la a todos os componentes:
using StockSharp.Algo;
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Obter sistema de arquivos
var fs = Paths.FileSystem;
// Criar armazenamento de dados
var drive = new LocalMarketDataDrive(fs, Paths.StorageDir);
// Criar conector e configurar armazenamento
var connector = new Connector();
connector.Adapter.StorageSettings.Drive = drive;
// Carregar configurações de um arquivo
var configFile = Path.Combine(Paths.AppDataPath, "connector_config.json");
if (configFile.IsConfigExists(fs))
{
var config = configFile.Deserialize<SettingsStorage>(fs);
connector.Load(config);
}
Overloads obsoletos
Muitas classes mantêm construtores sem IFileSystem por compatibilidade retroativa, mas estão marcados com o atributo [Obsolete]. Estes construtores utilizam 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) { }
Recomenda-se utilizar sempre overloads com passagem explícita de IFileSystem, uma vez que os construtores obsoletos serão removidos em versões futuras.