Ejemplo n.º 1
0
        private void SerializeHeader(MemoryStream fileHeaderStream, IBlobFileMetadata fileMetadata, long contentLength, DateTime versionTimeCreated)
        {
            if (fileHeaderStream == null)
            {
                throw new ArgumentNullException("fileHeaderStream");
            }

            if (fileMetadata == null)
            {
                throw new ArgumentNullException("fileMetadata");
            }

            //текущая версия заголовка = BlobConsts.BlobFile.FileHeaderCurrentVersion
            JsonBlobFileHeaderV1 header = new JsonBlobFileHeaderV1()
            {
                ContentAbsoluteStartPosition = this.BlobStream.Position,
                ContentLength   = contentLength,
                FileName        = fileMetadata.Name,
                FolderUrl       = fileMetadata.FolderMetadata.Url,
                UniqueID        = fileMetadata.UniqueID,
                TimeCreated     = versionTimeCreated,
                VersionUniqueID = fileMetadata.VersionUniqueID,
            };

            JsonDataSerializer.Serialize(fileHeaderStream, header);
        }
Ejemplo n.º 2
0
        internal object GetFileHeader(long startPosition)
        {
            if (startPosition < 0)
            {
                throw new ArgumentNullException("startPosition");
            }

            //читаем системный заголовок
            this.BlobStream.Seek(startPosition, SeekOrigin.Begin);
            byte[] systemHeaderBytes = new byte[BlobStreamAdapter.SystemHeaderLength];
            this.BlobStream.Read(systemHeaderBytes, 0, BlobStreamAdapter.SystemHeaderLength);

            //проверка целостности системного заголовка
            for (int i = 0; i < SystemHeaderFixedBytes.Length; i++)
            {
                if (SystemHeaderFixedBytes[i] != systemHeaderBytes[i])
                {
                    throw new Exception(string.Format("Битый заголовок файла (позиция {0}). Не удалось прочитать системный заголовок файла.",
                                                      i));
                }
            }

            //целостность системного заголовока не нарушена, значит можно поднять заголовок файла
            //сразу за фиксированной частью системного заголовка есть 4 байта, в которых указана длина заголовка файла
            //длина заголовка файла
            int headerLength = BitConverter.ToInt32(systemHeaderBytes, SystemHeaderFixedBytes.Length);

            if (headerLength < 1)
            {
                throw new Exception(string.Format("Не удалось считать длину заголовка файла"));
            }

            byte[] headerBytes = new byte[headerLength];
            this.BlobStream.Seek(startPosition + BlobStreamAdapter.SystemHeaderLength, SeekOrigin.Begin);
            this.BlobStream.Read(headerBytes, 0, headerBytes.Length);

            int    headerVersionNumber = BitConverter.ToInt32(systemHeaderBytes, SystemHeaderFixedBytes.Length + BlobConsts.BlobFile.HeaderSizeBytesLength + BlobConsts.BlobFile.AllHashBytesLength);
            object header = null;

            using (MemoryStream headerStream = new MemoryStream(headerBytes))
            {
                headerStream.Position = 0;
                JsonBlobFileHeaderV1 typedHeader = JsonDataSerializer.Deserialize <JsonBlobFileHeaderV1>(headerStream);
                typedHeader.HeaderLength = headerLength;

                if (typedHeader.ContentLength == 0)
                {
                    //длина на момент записи заголовка не была вычислина (потоковая передача)
                    //смотрим эту длину по системному заголовку
                    long contentLengBytesAbsolutePosition = FileStructure.GetContentLengBytesAbsolutePosition();
                    typedHeader.ContentLength = BitConverter.ToInt64(systemHeaderBytes, (int)contentLengBytesAbsolutePosition);
                }

                header = typedHeader;
            }

            return(header);
        }
Ejemplo n.º 3
0
        private object GetFileHeader(byte[] contentWithHeadersData)
        {
            if (contentWithHeadersData == null)
            {
                throw new ArgumentNullException("fileData");
            }

            object header = null;

            //сразу за системным заголовком 4 байта, в которых указана длина заголовка файла
            //длина заголовка файла
            int headerLength = BitConverter.ToInt32(contentWithHeadersData, SystemHeaderFixedBytes.Length);

            if (headerLength < 1)
            {
                throw new Exception(string.Format("Не удалось считать длину заголовка файла"));
            }

            byte[] headerBytes = new byte[headerLength];
            Array.Copy(contentWithHeadersData, BlobStreamAdapter.SystemHeaderLength, headerBytes, 0, headerLength);

            int headerVersionNumber = BitConverter.ToInt32(contentWithHeadersData, SystemHeaderFixedBytes.Length + BlobConsts.BlobFile.HeaderSizeBytesLength + BlobConsts.BlobFile.AllHashBytesLength);

            using (MemoryStream headerStream = new MemoryStream(headerBytes))
            {
                headerStream.Position = 0;
                JsonBlobFileHeaderV1 typedHeader = JsonDataSerializer.Deserialize <JsonBlobFileHeaderV1>(headerStream);
                typedHeader.HeaderLength = headerLength;

                if (typedHeader.ContentLength == 0)
                {
                    //длина на момент записи заголовка не была вычислина (потоковая передача)
                    //смотрим эту длину по системному заголовку
                    long contentLengBytesAbsolutePosition = FileStructure.GetContentLengBytesAbsolutePosition();
                    typedHeader.ContentLength = BitConverter.ToInt64(contentWithHeadersData, (int)contentLengBytesAbsolutePosition);
                }

                header = typedHeader;
            }

            return(header);
        }