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