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