private Blob CreateBlob() { //создание нового блоба string name = string.Format("{0}_{1}", BlobConsts.Blobs.Name, Guid.NewGuid().ToString(), BlobConsts.Blobs.Extension); IBlobMetadata blobMetadata = this.DataAdapter.BlobMetadataAdapter.CreateBlob(name, this.ID); this.DataAdapter.BlobMetadataAdapter.SaveBlob(blobMetadata); Blob newBlob = new Blob(this, blobMetadata); DateTime timeCreated = DateTime.Now; //создаем физический файл блоба //т.к. это первичное созадние файла, то "шарить" файл не нужно //пишем в него заголовок и закрываем поток using (FileStream fs = newBlob.File.Open(FileMode.Append, FileAccess.Write, FileShare.None)) { if (fs.Position != 0) { throw new Exception(string.Format("Невозможно записать заголовок блоба в непустой блоб. Заголовок блоба должен быть записан в начало блоба!")); } //записываем заголовок в начало блоба byte[] allBlobHeaderBytes = new byte[BlobConsts.Blobs.BlobHeaderSize]; //фиксированные байты заголовка блоба byte[] fixedHeaderBytes = Encoding.UTF8.GetBytes(BlobConsts.Blobs.BlobSystemHeader); Array.Copy(fixedHeaderBytes, 0, allBlobHeaderBytes, 0, fixedHeaderBytes.Length); int destinationOffset = fixedHeaderBytes.Length; //версия блоба int blobHeaderVersion = BlobConsts.Blobs.BlobHeaderCurrentVersion; byte[] blobHeaderVersionBytes = BitConverter.GetBytes(blobHeaderVersion); Array.Copy(blobHeaderVersionBytes, 0, allBlobHeaderBytes, destinationOffset, blobHeaderVersionBytes.Length); destinationOffset += blobHeaderVersionBytes.Length; BlobeHeaderV1 blobHeader = new BlobeHeaderV1() { ID = newBlob.ID, Name = newBlob.File.Name, FullName = newBlob.File.FullName, ContainerID = newBlob.Metadata.ContainerID, MachineName = Environment.MachineName, TimeCreated = timeCreated }; string blobHeaderJson = JsonDataSerializer.SerializeJson(blobHeader); byte[] blobHeaderBytes = Encoding.UTF8.GetBytes(blobHeaderJson); Array.Copy(blobHeaderBytes, 0, allBlobHeaderBytes, destinationOffset, blobHeaderBytes.Length); //запись всего заголовка блоба в файл блоба fs.Write(allBlobHeaderBytes, 0, allBlobHeaderBytes.Length); } return(newBlob); }