private unsafe void read(fastCSharp.code.cSharp.tcpBase.subByteArrayEvent buffer, Func <fastCSharp.net.returnValue <fastCSharp.code.cSharp.tcpBase.subByteArrayEvent>, bool> onReturn) { fileBlockStream fileStream = this.fileStream; subArray <byte> data = buffer.Buffer; if (fileStream != null && data.length == sizeof(fileBlockStream.index)) { fileBlockStream.index index; fixed(byte *bufferFixed = buffer.Buffer.array) index = *(fileBlockStream.index *)bufferFixed; fileStream.Read(onReturn, ref index); } else { onReturn(default(fastCSharp.code.cSharp.tcpBase.subByteArrayEvent)); } }
public void Wait() { WaitFileStream.wait(this); WaitFileStream = null; }
/// <summary> /// 文件分块服务 /// </summary> /// <param name="fileName">文件全名</param> public fileBlockServer(string fileName) { fileStream = new fileBlockStream(fileName); }
/// <summary> /// 开始读取文件 /// </summary> public unsafe void Read() { do { int readSize = index.Size + sizeof(int); try { if (FileStream.isDisposed == 0) { buffer = (memoryPool = memoryPool.GetOrCreate(readSize)).Get(); FileStream fileReader = FileStream.fileReader; long offset = fileReader.Position - index.Index; if (offset >= 0 || -offset < index.Index) { fileReader.Seek(offset, SeekOrigin.Current); } else { fileReader.Seek(index.Index, SeekOrigin.Begin); } if (fileReader.Read(buffer, 0, readSize) == readSize) { fixed(byte *bufferFixed = buffer) { if (*(int *)bufferFixed == index.Size) { readSize = index.Size; } else { log.Default.Add(FileStream.FileName + " index[" + index.Index.toString() + "] size[" + (*(int *)bufferFixed).toString() + "]<>" + index.Size.toString(), new System.Diagnostics.StackFrame(), false); } } } else { readSize = 0; } } } catch (Exception error) { log.Default.Add(error, null, false); } Func <fastCSharp.net.returnValue <fastCSharp.code.cSharp.tcpBase.subByteArrayEvent>, bool> onReaded = this.onReaded; if (readSize == index.Size) { if (onReaded(new fastCSharp.code.cSharp.tcpBase.subByteArrayEvent { Buffer = subArray <byte> .Unsafe(buffer, sizeof(int), index.Size), SerializeEvent = memoryPool })) { buffer = null; } else { memoryPool.Push(ref buffer); } } else { onReaded(default(fastCSharp.code.cSharp.tcpBase.subByteArrayEvent)); if (memoryPool != null) { memoryPool.Push(ref buffer); } } reader next = FileStream.next(this); if (next == null) { FileStream = null; onReaded = null; memoryPool = null; typePool <reader> .PushNotNull(this); return; } onReaded = next.onReaded; index = next.index; next.onReaded = null; typePool <reader> .PushNotNull(next); }while (true); }