В версии S# 4.0 формат данных был 1.XXX. В версии S# 4.1 было два формата, 2.0 и 3.0. Ниже два скрипта. Первый переводит 1.XXX в 2.0. Второй переводит из 2.0 в 3.0. Кто использует Гидру 4.0, нужно использовать оба скрипта, и прогнать их друг за другом. Кто уже использовал 4.1, то прогнать только второй. Пути, естественно, заменить в коде.
Конвертация в формат 2.0:
Код
foreach (var secDir in Directory.EnumerateDirectories(@"d:\SS\D\HydraRi3"))
{
	if (Directory.EnumerateFiles(secDir).Any())
		continue;
				
	var dateDirs = Directory.GetDirectories(secDir);
	var prefixes = new[] { "trades", "quotes" };
	foreach (var prefix in prefixes)
	{
				
		var metaInfo = new Dictionary<DateTime, IDictionary<string, object>>();
		foreach (var dir in dateDirs)
		{
			var date = Path.GetFileName(dir).ToDateTime("yyyy_MM_dd");
			var files = Directory.GetFiles(dir);
			var meta = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".xml");
			var data = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".bin");
			if (null != meta)
			{
				CultureInfo.InvariantCulture.DoInCulture(() => metaInfo.Add(date, new XmlSerializer<IDictionary<string, object>>().Deserialize(meta)));
				File.Move(data, Path.Combine(secDir, prefix + "_" + Path.GetFileName(dir) + ".bin"));
			}
		}
		CultureInfo.InvariantCulture.DoInCulture(() => new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Serialize(metaInfo, Path.Combine(secDir, prefix+".xml")));
	}
	foreach (var dir in dateDirs)
	{
		Directory.Delete(dir, true);
	}
	Console.WriteLine(Path.GetFileName(secDir));
}
 Конвертация в формат 3.0:
Код
var input = @"d:\SS\D\HydraRi3";
var output = @"d:\SS\D\HydraRi5.1";
foreach (var secDir in Directory.EnumerateDirectories(input))
{
	var prefixes = new[] { "quotes", "trades", "orderLog" };
	var secId = Path.GetFileName(secDir);
	Directory.CreateDirectory(Path.Combine(output,secId));
	foreach (var prefix in prefixes)
	{
		var metafile = secDir + "\\" + prefix + ".xml";
		if (File.Exists(metafile))
		{
			IDictionary<DateTime, IDictionary<string, object>> data=null; 
			CultureInfo.InvariantCulture.DoInCulture(() => data = new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Deserialize(metafile));
			//Directory.EnumerateFiles(secDir);
			foreach (var date in data.Keys)
			{
				var fileName = "{0}_{1}.bin".Put(prefix, date.ToString("yyyy_MM_dd"));
				fileName = Path.Combine(secDir,fileName);
				if (File.Exists(fileName))
				{
					var outSecDir = Path.Combine(output, secId, date.ToString("yyyy_MM_dd"));
					Directory.CreateDirectory(outSecDir);
					var outFile = Path.Combine(outSecDir, prefix + ".bin");
					using (var s = new FileStream(outFile, FileMode.Create, FileAccess.Write))
					{
						var dict = data[date];
						s.WriteByte(3); s.WriteByte(0);
						s.Write((int)dict["count"]);
						s.Write((decimal)dict["minStepSize"]);
						s.Write((decimal)0);
						s.Write(new DateTime(dict["firstTime"].To<long>()));
						s.Write(new DateTime(dict["prevTime"].To<long>()));
						if (prefix.Equals("trades"))
						{
							s.Write((long)dict["firstId"]);
							s.Write((long)dict["prevId"]);
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]); 
						}
						else if (prefix.Equals("quotes"))
						{
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]); 									
						}
						else if (prefix.Equals("orderLog"))
						{
							s.Write((long)dict["firstOrderId"]);
							s.Write((long)dict["firstTradeId"]);
							s.Write((long)dict["prevOrderId"]);
							s.Write((long)dict["prevTradeId"]);
							s.Write((decimal)dict["firstPrice"]);
							s.Write((decimal)dict["prevPrice"]);
						}
						s.WriteRaw(File.ReadAllBytes(fileName));
					}
				}
			}
		}
	}
}