예제 #1
0
        public void Import(string path)
        {
            var inputFile = new FileInfo(_inputPath);
            var ifile     = ModelUtility.GetIndexFile(path);
            var file      = new FileInfo(path);

            if (Global.PrintFile != null)
            {
                Global.PrintFile.WriteLine(@"Importing ""{0}"" into ""{1}"" for type {2}.", inputFile.Name, file.Name, typeof(TModel).Name);
                Global.PrintFile.WriteLine(@"Creating file ""{0}"".", file.FullName);
                Global.PrintFile.WriteLine(@"Creating index file ""{0}"" for primary key.", ifile.FullName);
            }

            using (var reader = new StreamReader(inputFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read))) {
                using (var iwriter = new BinaryWriter(ifile.Open(FileMode.Create, FileAccess.Write, FileShare.Read))) {
                    using (var writer = new BinaryWriter(file.Open(FileMode.Create, FileAccess.Write, FileShare.Read))) {
                        var i        = 0;
                        var position = 0L;

                        reader.ReadLine();

                        string line;

                        while ((line = reader.ReadLine()) != null)
                        {
                            var row   = line.Split(new[] { _delimiter });
                            var model = new TModel();

                            SetModel(model, row);

                            Write(iwriter, new Element(model.Id, position));
                            Write(writer, model);

                            position += _size;

                            if (i > 0 && i % 1024 == 0)
                            {
                                iwriter.Flush();
                                writer.Flush();
                            }

                            i++;
                        }
                    }
                }
            }
        }
예제 #2
0
        private TModel Seek(long location)
        {
            var offset = location - _position;

            if (offset != 0)
            {
                _stream.Seek(offset, SeekOrigin.Current);
            }

            _position = location + _size;

            _stream.Read(_buffer, 0, _size);

            _model = ModelUtility.PtrToStructure <TModel>(ref _buffer);

            return(_model);
        }
예제 #3
0
        public Reader(string path)
        {
            var file = new FileInfo(path);

            _size   = Marshal.SizeOf(typeof(TModel));
            _buffer = new byte[_size];
            _stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
            _count  = (int)file.Length / _size;

            _index = new Dictionary <int, long>(_count);

            var ifile   = ModelUtility.GetIndexFile(path);
            var isize   = Marshal.SizeOf(typeof(Element));
            var ibuffer = new byte[isize];

            using (var istream = ifile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) {
                while (istream.Read(ibuffer, 0, isize) != 0)
                {
                    var element = ModelUtility.PtrToStructure <Element>(ref ibuffer);

                    _index.Add(element.Id, element.Position);
                }
            }
        }