예제 #1
0
        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);
        }