Ejemplo n.º 1
0
        /// <summary>
        /// Записывает содержимое файла в блоб.
        /// </summary>
        /// <param name="fileMetadata">Матаданные файла.</param>
        /// <param name="stream">Содержимое файла.</param>
        /// <param name="remoteTimeCreated">Время создания версии с удаленного узла.</param>
        /// <returns></returns>
        internal BlobFileInfo Write(IBlobFileMetadata fileMetadata, Stream stream, DateTime?remoteTimeCreated = null)
        {
            if (fileMetadata == null)
            {
                throw new ArgumentNullException("fileMetadata");
            }

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

            this.Container.DataAdapter.Logger.WriteFormatMessage("Blob.Write:Начало записи содержимого в блоб, file.UniqueID: {0}", fileMetadata.UniqueID);

            BlobFileInfo blobFileInfo = new BlobFileInfo();

            blobFileInfo.BlobID = this.ID;
            bool closeBlob = false;

            DateTime timeCreated;

            if (remoteTimeCreated.HasValue)
            {
                timeCreated = remoteTimeCreated.Value;
            }
            else
            {
                //начиная с 4ой версии хранится время в UTC
                timeCreated = DateTime.Now.ToUniversalTime();
            }

            using (FileStream fs = this.File.Open(FileMode.Append, FileAccess.Write, FileShare.Read))
            {
                BlobStreamAdapter streamAdapter = new BlobStreamAdapter(fs);
                blobFileInfo.BlobStartPosition = fs.Length;
                streamAdapter.Write(fileMetadata, stream, timeCreated);
                blobFileInfo.BlobEndPosition = fs.Length;
                blobFileInfo.TimeCreated     = timeCreated;

                closeBlob = fs.Length > this.Container.DataAdapter.MaxBlobSize;
            }

            if (closeBlob)
            {
                this.Metadata.Closed = true;
                this.Container.DataAdapter.BlobMetadataAdapter.SaveBlob(this.Metadata);
            }

            this.Container.DataAdapter.Logger.WriteFormatMessage("Blob.Write:Окончание записи содержимого в блоб, file.UniqueID: {0}. Блоб был закрыт после записи файла: {1}",
                                                                 fileMetadata.UniqueID,
                                                                 closeBlob);

            return(blobFileInfo);
        }
Ejemplo n.º 2
0
        private IFileVersionMetadata WriteInternal(IBlobFileMetadata blobFileMetadata, Stream stream, DateTime?remoteTimeCreated = null)
        {
            if (blobFileMetadata == null)
            {
                throw new ArgumentNullException("param");
            }

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

            this.Logger.WriteFormatMessage("WriteFile:Начало записи файла, folderMetadata.Name: {0}, fileName: {1}", blobFileMetadata.FolderMetadata.Name, blobFileMetadata.Name);

            //получение контейнера блобов.
            BlobContainer container = this.GetBlobContainer(blobFileMetadata.FolderMetadata);

            //запись файла в контейнер.
            BlobFileInfo blobFileInfo = container.Write(blobFileMetadata, stream, remoteTimeCreated);

            //установка свойств файла, хранящегося в блобе
            blobFileMetadata.BlobID            = blobFileInfo.BlobID;
            blobFileMetadata.BlobStartPosition = blobFileInfo.BlobStartPosition;
            blobFileMetadata.BlobEndPosition   = blobFileInfo.BlobEndPosition;

            this.Logger.WriteMessage("WriteFile:Начало сохранения метаданных файла");
            IBlobFileVersionMetadata savedVersion = this.BlobMetadataAdapter.SaveFile(blobFileMetadata, blobFileInfo.TimeCreated);

            this.Logger.WriteMessage("WriteFile:Окончание сохранения метаданных файла");

            this.Logger.WriteFormatMessage("WriteFile:Начало записи файла, folderMetadata.Name: {0}, fileName: {1}, fileUniqueID: {2}, fileVersionUniqueID: {3}",
                                           blobFileMetadata.FolderMetadata.Name,
                                           blobFileMetadata.Name,
                                           savedVersion.FileMetadata.UniqueID,
                                           savedVersion.UniqueID);

            return(savedVersion);
        }