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); }
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); }
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); }