/// <summary>
 ///     文件流写入器
 /// </summary>
 /// <param name="fileName">文件全名</param>
 /// <param name="mode">打开方式</param>
 /// <param name="fileShare">共享访问方式</param>
 /// <param name="fileOption">附加选项</param>
 /// <param name="encoding">文件编码</param>
 public TmphFileStreamWriter(string fileName, FileMode mode = FileMode.CreateNew,
     FileShare fileShare = FileShare.None, FileOptions fileOption = FileOptions.None, bool isLog = true,
     Encoding encoding = null)
 {
     if (fileName.Length() == 0) TmphLog.Error.Throw(TmphLog.TmphExceptionType.Null);
     FileName = fileName;
     this.isLog = isLog;
     this.fileShare = fileShare;
     this.fileOption = fileOption;
     this.encoding = encoding;
     memoryPool = TmphMemoryPool.GetPool(bufferLength = (int)TmphFile.BytesPerCluster(fileName));
     TmphBuffer = memoryPool.Get();
     writeFileHandle = writeFile;
     open(mode);
     flushWait = new EventWaitHandle(true, EventResetMode.ManualReset);
 }
 /// <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="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>
 /// <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);
         }
     }
 }