Example #1
0
        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);
                    }
                }
            }
        }
Example #2
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();
                }
            }
        }