IFileSystem と Paths.FileSystem

概要

IFileSystem は、StockSharp 全体で使用されるファイルシステム抽象化です。System.IO.FileSystem.IO.Directory に直接アクセスする代わりに、プラットフォームのコンポーネントはこのインターフェイスを介して動作します。これにより、次の利点があります。

  • テスト容易性 -- 単体テストでファイルシステムを差し替えられること
  • 移植性 -- さまざまな環境(ローカルディスク、クラウドストレージ、メモリ)に対する統一インターフェイス
  • 一貫性 -- すべてのコンポーネントがファイル操作に同じアプローチを使用すること

IFileSystem インターフェイスは Ecng.Common パッケージで定義されており、ファイルとディレクトリを扱うためのメソッドを提供します。作成、読み取り、書き込み、削除、存在確認、ファイル列挙などです。

Paths.FileSystem

Paths クラス(名前空間 StockSharp.Configuration)は、既定の IFileSystem 実装である静的な FileSystem プロパティを提供します。

public static class Paths
{
    // 標準ファイルシステム (LocalFileSystem)
    public static readonly IFileSystem FileSystem = Messages.Extensions.DefaultFileSystem;
}

Paths.FileSystemLocalFileSystem.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);

シリアル化と逆シリアル化

JSON 設定を扱うための Paths の拡張メソッド:

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 を渡すオーバーロードを常に使用することが推奨されます。