/// <summary> /// 写入数据 /// </summary> /// <returns></returns> private bool write() { Buffer data = BufferLink.GetClear(); if (data != null) { FileBuffers buffer = default(FileBuffers); bufferPool.Get(ref buffer.Buffer); long writeLength = 0; try { fixed(byte *bufferFixed = buffer.Buffer.Buffer) { byte *bufferStart = bufferFixed + buffer.Buffer.StartIndex; int index = sizeof(int), bigBufferSize; START: if (data.Array.Length + index <= buffer.Buffer.Length) { if ((data = data.Copy(ref buffer.Buffer, ref index) ?? BufferLink.GetClear()) != null) { goto START; } } else if (index == sizeof(int)) { if (bigBuffer.Length < (bigBufferSize = data.Array.Length + sizeof(int))) { bigBuffer = new byte[Math.Max(bigBufferSize, bigBuffer.Length << 1)]; fixed(byte *bigBufferFixed = bigBuffer) { data = data.Copy(bigBuffer); if (bigBufferSize > Config.MinCompressSize) { if (AutoCSer.IO.Compression.DeflateCompressor.Get(bigBuffer, sizeof(int), bigBufferSize - sizeof(int), ref buffer.CompressionBuffer, ref buffer.CompressionData, sizeof(int) * 2, sizeof(int) * 2)) { writeCompression(ref buffer.CompressionData, bigBufferSize - sizeof(int)); buffer.CompressionBuffer.TryFree(); writeLength += buffer.CompressionData.Length; if (data == null && (data = BufferLink.GetClear()) == null) { return(true); } index = sizeof(int); goto START; } buffer.CompressionBuffer.TryFree(); } *(int *)bigBufferFixed = bigBufferSize - sizeof(int); } fileStream.Write(bigBuffer, 0, bigBufferSize); writeLength += bigBufferSize; if (data == null && (data = BufferLink.GetClear()) == null) return(true); } index = sizeof(int); goto START; } if (index > Config.MinCompressSize) { if (AutoCSer.IO.Compression.DeflateCompressor.Get(buffer.Buffer.Buffer, buffer.Buffer.StartIndex + sizeof(int), index - sizeof(int), ref buffer.CompressionBuffer, ref buffer.CompressionData, sizeof(int) * 2, sizeof(int) * 2)) { writeCompression(ref buffer.CompressionData, index - sizeof(int)); buffer.CompressionBuffer.TryFree(); writeLength += buffer.CompressionData.Length; if (data == null && (data = BufferLink.GetClear()) == null) { return(true); } index = sizeof(int); goto START; } buffer.CompressionBuffer.TryFree(); } *(int *)bufferStart = index - sizeof(int); fileStream.Write(buffer.Buffer.Buffer, buffer.Buffer.StartIndex, index); writeLength += index; if (data == null && (data = BufferLink.GetClear()) == null) { return(true); } index = sizeof(int); goto START; } } catch (Exception error) { writeLength = 0; AutoCSer.Log.Pub.Log.Add(Log.LogType.Fatal, error); fileStream.Dispose(); return(false); } finally { buffer.Free(); if (writeLength != 0) { fileStream.Flush(true); FileLength += writeLength; for (FileReader reader = Readers.End; reader != null; reader = reader.DoubleLinkPrevious) { isTryRead |= reader.TryRead(); } } } } return(true); }