IFileSystem und Paths.FileSystem
Überblick
IFileSystem ist eine Dateisystemabstraktion, die in StockSharp durchgängig verwendet wird. Statt direkt auf System.IO.File und System.IO.Directory zuzugreifen, arbeiten Plattformkomponenten über diese Schnittstelle. Das bietet:
- Testbarkeit - die Möglichkeit, das Dateisystem in Unit-Tests zu ersetzen
- Portabilität - eine einheitliche Schnittstelle für verschiedene Umgebungen (lokaler Datenträger, Cloud-Speicher, Arbeitsspeicher)
- Konsistenz - alle Komponenten verwenden denselben Ansatz für die Arbeit mit Dateien
Die Schnittstelle IFileSystem ist im Paket Ecng.Common definiert und stellt Methoden für die Arbeit mit Dateien und Verzeichnissen bereit: Erstellen, Lesen, Schreiben, Löschen, Prüfen auf Existenz und Auflisten von Dateien.
Paths.FileSystem
Die Klasse Paths (Namespace StockSharp.Configuration) stellt die statische Eigenschaft FileSystem bereit - die standardmäßige IFileSystem-Implementierung:
public static class Paths
{
// Standard-Dateisystem (LocalFileSystem)
public static readonly IFileSystem FileSystem = Messages.Extensions.DefaultFileSystem;
}
Paths.FileSystem verweist auf LocalFileSystem.Instance - ein Singleton, das über die Standardfunktionen von System.IO mit dem lokalen Datenträger arbeitet.
Wichtige IFileSystem-Methoden
Die Schnittstelle IFileSystem enthält Methoden für typische Operationen:
| Methode | Beschreibung |
|---|---|
FileExists(path) |
Prüfen, ob eine Datei vorhanden ist |
DirectoryExists(path) |
Prüfen, ob ein Verzeichnis vorhanden ist |
CreateDirectory(path) |
Ein Verzeichnis erstellen |
OpenRead(path) |
Eine Datei zum Lesen öffnen (Stream) |
OpenWrite(path) |
Eine Datei zum Schreiben öffnen (Stream) |
MoveFile(src, dst) |
Eine Datei verschieben |
DeleteFile(path) |
Eine Datei löschen |
EnumerateFiles(path, mask) |
Dateien in einem Verzeichnis aufzählen |
WriteAllTextAsync(path, text) |
Text asynchron in eine Datei schreiben |
Wo es verwendet wird
Praktisch alle StockSharp-Komponenten, die mit dem Dateisystem arbeiten, akzeptieren IFileSystem in ihrem Konstruktor. Unten sind die häufigsten Fälle aufgeführt.
LocalMarketDataDrive
Marktdatenspeicher auf lokalem Datenträger:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Empfohlene Variante - IFileSystem explizit übergeben
var drive = new LocalMarketDataDrive(Paths.FileSystem, @"C:\MarketData");
// Veraltete Variante (verwendet Paths.FileSystem intern)
// var drive = new LocalMarketDataDrive(@"C:\MarketData"); // [Obsolete]
CsvEntityRegistry
Entitätsregistrierung (Börsen, Instrumente, Portfolios) im CSV-Format:
using StockSharp.Algo.Storages.Csv;
using StockSharp.Configuration;
var executor = new ChannelExecutor();
var registry = new CsvEntityRegistry(Paths.FileSystem, @"C:\Data", executor);
SnapshotRegistry
Registrierung für Marktdaten-Snapshots:
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
var snapshots = new SnapshotRegistry(Paths.FileSystem, Paths.SnapshotsDir);
Serialisierung und Deserialisierung
Erweiterungsmethoden in Paths für die Arbeit mit JSON-Konfigurationen:
using StockSharp.Configuration;
var fs = Paths.FileSystem;
// Objekt in eine Datei serialisieren
settings.Serialize(fs, @"C:\config.json");
// Objekt aus einer Datei deserialisieren
var loaded = @"C:\config.json".Deserialize<SettingsStorage>(fs);
// Asynchrone Deserialisierung
var data = await @"C:\data.json".DeserializeAsync<MyData>(fs, cancellationToken);
// Prüfen, ob eine Konfigurationsdatei vorhanden ist
if (@"C:\config.json".IsConfigExists(fs))
{
// ...
}
CandlePatternFileStorage
Speicher für Kerzenmuster:
using StockSharp.Algo.Candles.Patterns;
using StockSharp.Configuration;
var patternStorage = new CandlePatternFileStorage(
Paths.FileSystem,
Paths.CandlePatternsFile,
executor
);
NativeIdStorage, SecurityMappingStorage und weitere
Die meisten Speicher für Zuordnungen und Kennungen akzeptieren ebenfalls 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);
Typisches Verwendungsmuster
In StockSharp-Anwendungen wird empfohlen, eine Referenz auf IFileSystem zu halten und sie an alle Komponenten zu übergeben:
using StockSharp.Algo;
using StockSharp.Algo.Storages;
using StockSharp.Configuration;
// Dateisystem abrufen
var fs = Paths.FileSystem;
// Datenspeicher erstellen
var drive = new LocalMarketDataDrive(fs, Paths.StorageDir);
// Connector erstellen und Speicher konfigurieren
var connector = new Connector();
connector.Adapter.StorageSettings.Drive = drive;
// Einstellungen aus einer Datei laden
var configFile = Path.Combine(Paths.AppDataPath, "connector_config.json");
if (configFile.IsConfigExists(fs))
{
var config = configFile.Deserialize<SettingsStorage>(fs);
connector.Load(config);
}
Veraltete Überladungen
Viele Klassen behalten aus Gründen der Abwärtskompatibilität Konstruktoren ohne IFileSystem bei, diese sind jedoch mit dem Attribut [Obsolete] markiert. Diese Konstruktoren verwenden intern Paths.FileSystem:
// Veraltete Variante
[Obsolete("Use IFileSystem overload.")]
public LocalMarketDataDrive(string path)
: this(Paths.FileSystem, path) { }
// Empfohlene Variante
public LocalMarketDataDrive(IFileSystem fileSystem, string path) { }
Es wird empfohlen, immer Überladungen mit explizit übergebenem IFileSystem zu verwenden, da veraltete Konstruktoren in zukünftigen Versionen entfernt werden.