void AddNewValue() { OpenFileDialog openDic = new OpenFileDialog(); openDic.Multiselect = false; openDic.Filter = string.Format("{0} (*.{1})|*.{1}", "Index файл", "index"); if (openDic.ShowDialog() == DialogResult.OK) { var basePath = System.IO.Path.ChangeExtension(openDic.FileName, null); var indexFile = basePath + ".index"; var baseFile = basePath + ".base"; var header = Helper.ReadFromBinaryFile <SelfOrganizeIndexHeader>(openDic.FileName, 0); if (header.version == 0) { Console.WriteLine("Incorrect file header"); MessageBox.Show("Incorrect file header"); return; } if (header.version != _version) { Console.WriteLine("Old version,fix it"); MessageBox.Show("Old version, fix it"); return; } Console.WriteLine("Be patient!Operation may take some time,depending on index file"); var lst = Helper.ReadFromBinaryFileList <SelfOrganizeIndexNode>(indexFile, header.nodesBeginOffset, 0, true); while (true) { Console.WriteLine("Enter value to add, -1 to exit"); var data = Console.ReadLine(); if (data.Contains("-1")) { break; } Console.WriteLine("Wait..."); var hash = Helper.GetHash(data, _hashType); var exist = lst.Where(x => x.hash == hash); if (exist.Any()) { Console.WriteLine("This value already exists"); } else { var newNode = new SelfOrganizeFileNode() { text = data }; var lastNodePos = Helper.WriteToBinaryFile <SelfOrganizeFileNode>(baseFile, newNode, FileMode.Append); var indexNode = new SelfOrganizeIndexNode() { hash = Helper.GetHash(data, _hashType), len = System.Runtime.InteropServices.Marshal.SizeOf(newNode), offset = lastNodePos }; lst.Add(indexNode); Helper.WriteToBinaryFile <SelfOrganizeIndexNode>(indexFile, indexNode, FileMode.Append); header.count += 1; Helper.WriteToBinaryFile <SelfOrganizeIndexHeader>(indexFile, header, FileMode.Open, 0); } } } }
void GenerateNewSelfOrganizingFile() { OpenFileDialog openDic = new OpenFileDialog(); openDic.Multiselect = false; var items = new List <SelfOrganizeIndexNode>(); if (openDic.ShowDialog() == DialogResult.OK) { var fileName = GenerateNameForNewFile(); var lines = System.IO.File.ReadAllLines(openDic.FileName); if (lines.Count() > 0) { Console.WriteLine("Be patient!Operation may take some time,depending on input file"); var indexFile = fileName + ".index"; var baseFile = fileName + ".base"; //Write 1st text element var firstFileNode = new SelfOrganizeFileNode() { text = lines.ElementAt(0) }; var firstFileNodePos = Helper.WriteToBinaryFile <SelfOrganizeFileNode>(baseFile, firstFileNode, FileMode.CreateNew); var header = new SelfOrganizeIndexHeader() { version = _version, hashType = _hashType, count = lines.Count(), nodesBeginOffset = 0, }; //Write header var firstIndexPos = Helper.WriteToBinaryFile <SelfOrganizeIndexHeader>(indexFile, header, FileMode.CreateNew, -1, false); //Update header with correct information header.nodesBeginOffset = firstIndexPos; Helper.WriteToBinaryFile <SelfOrganizeIndexHeader>(indexFile, header, FileMode.Open, 0); var firstIndexNode = new SelfOrganizeIndexNode() { hash = Helper.GetHash(firstFileNode.text, _hashType), len = Marshal.SizeOf(firstFileNode), offset = firstFileNodePos }; //Add 1st index Helper.WriteToBinaryFile <SelfOrganizeIndexNode>(indexFile, firstIndexNode, FileMode.Append); var res = new List <SelfOrganizeIndexNode>(); for (int i = 1; i < lines.Count(); i++) { var item = lines[i]; var fileNode = new SelfOrganizeFileNode() { text = item }; var lastNodePos = Helper.WriteToBinaryFile <SelfOrganizeFileNode>(baseFile, fileNode, FileMode.Append); var indexNode = new SelfOrganizeIndexNode() { hash = Helper.GetHash(item, _hashType), len = System.Runtime.InteropServices.Marshal.SizeOf(fileNode), offset = lastNodePos }; res.Add(indexNode); } Helper.WriteToBinaryFileList <SelfOrganizeIndexNode>(indexFile, res, FileMode.Append); res.Clear(); } } }