public override void TestFixtureSetUp() { base.TestFixtureSetUp(); var header = new PTableHeader(1); using (var f = File.Open(Filename, FileMode.OpenOrCreate)) { f.Seek(0, SeekOrigin.Begin); var bytes = header.AsByteArray(); f.Write(bytes, 0, bytes.Length); var size = (long)(uint.MaxValue + 10000000L) * (long)PTable.IndexEntrySize + PTableHeader.Size + PTable.MD5Size; Console.WriteLine("allocating file " + Filename + " size is " + size); f.SetLength(size); Console.WriteLine("file allocated"); } _ptable = PTable.FromFile(Filename, 22); }
public static void CreatePTableFile(string filename, long ptableSize, int indexEntrySize, int cacheDepth = 16) { //TODO: fix this unsafe test it will fill the target disk if the test is aborted or an error occurs Ensure.NotNullOrEmpty(filename, "filename"); Ensure.Nonnegative(cacheDepth, "cacheDepth"); var sw = Stopwatch.StartNew(); var tableId = Guid.NewGuid(); using (var fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, FileShare.None, DefaultSequentialBufferSize, FileOptions.SequentialScan)) { fs.SetLength((long)ptableSize); fs.Seek(0, SeekOrigin.Begin); var recordCount = (long)((ptableSize - PTableHeader.Size - PTable.MD5Size) / (long)indexEntrySize); using (var md5 = MD5.Create()) using (var cs = new CryptoStream(fs, md5, CryptoStreamMode.Write)) using (var bs = new BufferedStream(cs, DefaultSequentialBufferSize)) { // WRITE HEADER var headerBytes = new PTableHeader(Version).AsByteArray(); cs.Write(headerBytes, 0, headerBytes.Length); // WRITE INDEX ENTRIES var buffer = new byte[indexEntrySize]; for (long i = 0; i < recordCount; i++) { bs.Write(buffer, 0, indexEntrySize); } bs.Flush(); cs.FlushFinalBlock(); // WRITE MD5 var hash = md5.Hash; fs.Write(hash, 0, hash.Length); } } Console.WriteLine("Created PTable File[{0}, size of {1}] in {2}.", tableId, ptableSize, sw.Elapsed); }