/// <summary> /// 写入数据 /// </summary> /// <param name="data">数据</param> /// <returns>写入位置,失败返回-1</returns> internal long UnsafeWrite(TmphMemoryPool.TmphPushSubArray data) { flushWait.Reset(); var dataArray = data.Value; TmphInterlocked.NoCheckCompareSetSleep0(ref bufferLock); if (isDisposed == 0) { var fileBufferLength = this.fileBufferLength; this.fileBufferLength += dataArray.Count; if (isWritting == 0) { var length = currentIndex + dataArray.Count; if (length < bufferLength && flushCount == 0) { Buffer.BlockCopy(dataArray.array, dataArray.StartIndex, TmphBuffer, currentIndex, dataArray.Count); checkFlushTime = TmphDate.NowSecond.AddTicks(checkFlushTicks); currentIndex = length; bufferIndex = this.fileBufferLength; bufferLock = 0; data.Push(); setCheckFlush(); } else { buffers.array[0] = data; buffers.Unsafer.AddLength(1); bufferSize += dataArray.Count; isFlush = 0; isWritting = 1; isCopyBuffer = 0; bufferLock = 0; TmphThreadPool.TinyPool.FastStart(writeFileHandle, null, null); } } else { try { buffers.Add(data); bufferSize += dataArray.Count; isCopyBuffer = 0; } finally { bufferLock = 0; } } return fileBufferLength; } bufferLock = 0; data.Push(); return -1; }
/// <summary> /// 获取缩略图 /// </summary> /// <param name="width">缩略宽度</param> /// <param name="height">缩略高度</param> /// <param name="type">目标图像文件格式</param> /// <returns>缩略图数据流</returns> public TmphSubArray<byte> Get(ref int width, ref int height, ImageFormat type, TmphMemoryPool TmphMemoryPool, int seek) { if (check(ref width, ref height)) { if (TmphMemoryPool == null) { using (MemoryStream stream = new MemoryStream()) { if (seek != 0) stream.Seek(seek, SeekOrigin.Begin); get(stream, width, height, type); return TmphSubArray<byte>.Unsafe(stream.GetBuffer(), seek, (int)stream.Position - seek); } } byte[] buffer = TmphMemoryPool.Get(); try { #if MONO using (MemoryStream stream = memoryStream.Get(buffer)) #else using (MemoryStream stream = TmphMemoryStreamProxy.Get(buffer)) #endif { if (seek != 0) stream.Seek(seek, SeekOrigin.Begin); get(stream, width, height, type); byte[] data = stream.GetBuffer(); if (buffer == data) { buffer = null; //showjim if ((int)stream.Position > data.Length) { TmphLog.Error.Add("Position " + ((int)stream.Position).toString() + " > " + data.Length.toString(), true, false); } return TmphSubArray<byte>.Unsafe(data, seek, (int)stream.Position - seek); } return TmphSubArray<byte>.Unsafe(data, seek, (int)stream.Position - seek); } } finally { TmphMemoryPool.Push(ref buffer); } } return default(TmphSubArray<byte>); }
/// <summary> /// 压缩数据 /// </summary> /// <param name="data">原始数据</param> /// <param name="startIndex">起始位置</param> /// <param name="count">压缩字节数</param> /// <param name="seek">起始位置</param> /// <returns>压缩后的数据,失败返回null</returns> internal TmphSubArray<byte> GetCompressUnsafe(byte[] data, int startIndex, int count, int seek = 0, TmphMemoryPool memoryPool = null) { var length = count + seek; if (memoryPool == null) { using (var dataStream = new MemoryStream()) { if (seek != 0) dataStream.Seek(seek, SeekOrigin.Begin); using (var compressStream = getStream(dataStream)) { compressStream.Write(data, startIndex, count); } if (dataStream.Position < length) { return TmphSubArray<byte>.Unsafe(dataStream.GetBuffer(), seek, (int)dataStream.Position - seek); } } } else { var TmphBuffer = memoryPool.Get(); try { using (var dataStream = TmphMemoryStream.Get(TmphBuffer)) { if (seek != 0) dataStream.Seek(seek, SeekOrigin.Begin); using (var compressStream = getStream(dataStream)) { compressStream.Write(data, startIndex, count); } if (dataStream.Position < length) { var streamBuffer = dataStream.GetBuffer(); if (streamBuffer == TmphBuffer) TmphBuffer = null; return TmphSubArray<byte>.Unsafe(streamBuffer, seek, (int)dataStream.Position - seek); } } } catch (Exception error) { TmphLog.Error.Add(error, null, false); } finally { memoryPool.Push(ref TmphBuffer); } } return default(TmphSubArray<byte>); }
/// <summary> /// 获取压缩数据 /// </summary> /// <param name="data">数据</param> /// <returns>压缩数据,失败返回null</returns> internal static TmphSubArray<byte> GetCompress(TmphSubArray<byte> data, TmphMemoryPool memoryPool = null, int seek = 0) { if (data.Count > GZipSize) { var compressData = TmphStream.GZip.GetCompress(data.Array, data.StartIndex, data.Count, seek, memoryPool); if (compressData.Count != 0) { if (compressData.Count + GZipSize < data.Count) return compressData; if (memoryPool != null) memoryPool.Push(ref compressData.array); } } return default(TmphSubArray<byte>); }
/// <summary> /// 获取解压数据 /// </summary> /// <returns>解压数据</returns> public unsafe TmphSubArray<byte> Get(TmphMemoryPool memoryPool) { if (memoryPool == null) { var data = TmphUnmanagedPool.StreamBuffers.Get(); try { using (dataStream = new TmphUnmanagedStream(data.Byte, TmphUnmanagedPool.StreamBuffers.Size)) { get(); return new TmphSubArray<byte>(dataStream.GetArray()); } } finally { TmphUnmanagedPool.StreamBuffers.Push(ref data); } } else { var data = memoryPool.Get(); try { fixed (byte* dataFixed = data) { using (dataStream = new TmphUnmanagedStream(dataFixed, data.Length)) { get(); if (dataStream.Data == dataFixed) { var TmphBuffer = data; data = null; return TmphSubArray<byte>.Unsafe(TmphBuffer, 0, dataStream.Length); } return new TmphSubArray<byte>(dataStream.GetArray()); } } } finally { memoryPool.Push(ref data); } } }