private static void Create(string sarc2path) { Stream stream = new FileStream(sarc2path, FileMode.Open, FileAccess.Read); long offset = 0L; for (int i = 0; i < 16; i++) { int b = stream.ReadByte(); if (b != 0) { offset = offset * 10 + (b - '0'); } } byte[] catalog_bytes = new byte[offset - 16]; stream.Read(catalog_bytes, 0, (int)(offset - 16)); int width = 0; int height = 0; var levels = XElement.Load(new XmlTextReader(new MemoryStream(catalog_bytes))).Elements("file") .Select(xfile => { string r_path = xfile.Element("path").Value; var regex = new Regex(@"(?<level>[0-9]+)/(?<x>[0-9]+)_(?<y>[0-9]+)\.jpg$"); var match = regex.Match(r_path); if (!match.Success) { if (Path.GetExtension(r_path) == ".xml") { stream.Seek(long.Parse(xfile.Element("start").Value) + offset, SeekOrigin.Begin); var dataxml = new byte[long.Parse(xfile.Element("length").Value)]; stream.Read(dataxml, 0, dataxml.Length); XElement xDzi = XElement.Load(XmlReader.Create(new MemoryStream(dataxml))); var xElement = xDzi.Element(XNamespace.Get("http://schemas.microsoft.com/deepzoom/2009") + "Size"); width = int.Parse(xElement.Attribute("Width").Value); height = int.Parse(xElement.Attribute("Height").Value); return(null); } else { throw new Exception(); } } int level = Convert.ToInt32(match.Groups["level"].Value); int x = Convert.ToInt32(match.Groups["x"].Value); int y = Convert.ToInt32(match.Groups["y"].Value); stream.Seek(long.Parse(xfile.Element("start").Value) + offset, SeekOrigin.Begin); var data = new byte[long.Parse(xfile.Element("length").Value)]; stream.Read(data, 0, data.Length); return(new { level, x, y, data = data.Cast <object>().ToArray() }); }) .Where(arg => arg != null) .GroupBy(arg => arg.level) .OrderBy(level => level.Key) .Select(gl => gl.GroupBy(arg => arg.x) .OrderBy(xs => xs.Key) .Select(gx => gx.OrderBy(arg => arg.y) .Select(arg => arg.data) .ToArray()) .ToArray()) .ToArray(); stream.Close(); if (width == 0 || height == 0) { throw new Exception(); } cell = new PxCell( new PTypeRecord(new NamedType("width", new PType(PTypeEnumeration.integer)), new NamedType("height", new PType(PTypeEnumeration.integer)), new NamedType("images", new PTypeSequence( //by level new PTypeSequence( //by x new PTypeSequence( //by y new PTypeSequence(new PType(PTypeEnumeration.@byte))))))), Path.ChangeExtension(sarc2path, ".dz_px"), false); cell.Fill(new object[] { width, height, levels }); }
static void Main(string[] args) { string path = @"..\..\..\Databases\"; InitTypes(); DateTime tt0 = DateTime.Now; // Проверка объекта object[] testdb = new object[] { new object[] { 1, new object[] { "a", "b", "c" } }, new object[] { 1, new object[] { "a1", "b1", "c1" } }, new object[] { 2, new object[] { "da", "db", "dc", "lang" } } }; Console.WriteLine(seqtriplets.Interpret(testdb)); // Создание ячейки плавающего формата string testpacfilename = path + "test.pac"; if (System.IO.File.Exists(testpacfilename)) { System.IO.File.Delete(testpacfilename); } PaCell cell = new PaCell(seqtriplets, testpacfilename, false); // false - чтобы заполнять // Заполнение ячейки данными из объекта cell.Fill(testdb); // Проверка того, что имеется в ячейке var cell_pvalue = cell.Root.GetValue(); Console.WriteLine(cell_pvalue.Type.Interpret(cell_pvalue.Value)); PTypeUnion tp_u = new PTypeUnion(); tp_u.Variants = new[] { new NamedType("empty", new PType(PTypeEnumeration.none)), new NamedType("node", new PTypeRecord( new NamedType("f0", new PType(PTypeEnumeration.boolean)), new NamedType("f1", new PTypeSequence(tp_u)))) }; object[] vv = new object[] { 1, new object[] { true, new object[] { new object[] { 1, new object[] { false, new object[0] } } } } }; PxCell xcell = new PxCell(tp_u, path + "xcell.pxc", false); xcell.Fill(vv); PxEntry e1 = xcell.Root.UElement().Field(1); PxEntry e2 = e1.Element(0); var v = e2.GetValue(); Console.WriteLine(v.Type.Interpret(v.Value)); return; //cell.Clear(); //cell.Fill(testtriplets); // проверка на то, что при неочищенной ячейке, записать в нее нельзя //cell.Close(); //cell.Clear(); //cell.Fill(testtriplets); // проверка на то, что при очищении, записать можно //// Проверка серийного буфера, в него загружаются данные из XML-файла, в ячейку ничего не помещается //// Этот тест, для начала, можно пропустить. //tt0 = DateTime.Now; //SerialBuffer buff = new SerialBuffer(new SerialFlowReceiverStub(seqtriplets)); //TestSerialInput(buff, path); //Console.WriteLine("Число элементов в объекте:" + ((object[])buff.Result).LongLength); //Console.WriteLine("Forming buffer ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Проверка ввода из серийного скобочного потока для ячейки свободного формата // В данном случае, поток порождается при сканировании XML-документа tt0 = DateTime.Now; cell.Clear(); TestSerialInput(cell, path); Console.WriteLine("Число элементов в объекте:" + cell.Root.Count()); Console.WriteLine("Serial input ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; cell.Close(); // Ячейка закрыта, теперь ее нельзя использовать // Проверка создания ячейки в режиме чтения PaCell cell2pac = new PaCell(seqtriplets, testpacfilename); long cnt2 = cell2pac.Root.Count(); var pval2 = cell2pac.Root.Element(100000).GetValue(); Console.WriteLine("cnt2=" + cnt2 + " Element(100000).Get()=" + pval2.Type.Interpret(pval2.Value)); Console.WriteLine("ReadObly cell ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Создание ячейки фиксированного формата xcell.Clear(); xcell = new PxCell(seqtriplets, path + "test.pxc", false); var pv = cell2pac.Root.Get(); tt0 = DateTime.Now; xcell.Fill2(pv); // Плохой метод, заменю на хороший Console.WriteLine("xcell Fill ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // Проверка наполнения PxEntry rxt = xcell.Root; var ele = rxt.Element(400000).GetValue(); Console.WriteLine(ele.Type.Interpret(ele.Value)); Console.WriteLine("ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; }