コード例 #1
0
        /// <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);
        }