public static void SafeReadFile(Stream stream, string guId, string FileName, string FilePath)
       {
           int bufferLength = 32768;
           //文件数据块编号
           int _order_Num = 0;
           //初始化一个32k的缓存
           //byte[] buffer = new byte[32768];
           byte[] buffer = new byte[bufferLength];
           int byteLength = 0;
           int read = 0;
           int block;
           //每次从流中读取缓存大小的数据,知道读取完所有的流为止
           TransferSendFileObj fileObj0 = new TransferSendFileObj();
           FilesQueue.Instance.Get(guId, out fileObj0);
           fileObj0.Status = SendFileStatus.Reading;
           FilesQueue.Instance.Add(guId, fileObj0);
           //Utility.Log.Log.writeLineToLog("开始读取文件","Read");
           while ((block = stream.Read(buffer, 0, buffer.Length)) > 0)
           {
               byteLength = byteLength + block;
               //重新设定读取位置
               read += block;
               _order_Num = _order_Num + 1;
               //检查是否到达了缓存的边界,检查是否还有可以读取的信息
               if (block == buffer.Length)
               {
                   //压入文件块传输缓存队列
                   TransferFileDataObj fileBlock = new TransferFileDataObj();
                   fileBlock.guId = guId;
                   Array.Copy(buffer, fileBlock.FileData, buffer.Length);
                   fileBlock.FilePath = FilePath;
                   fileBlock.Order_Num = _order_Num;
                   fileBlock.FileName = FileName;
                   fileBlock.CanReadLength = bufferLength;
                   FilesBlocksQueue.Instance.Add(fileBlock);
                   //Utility.Log.Log.writeLineToLog("读取文件块入队列:" + _order_Num.ToString(), "Read");
                   FilesQueue.Instance.Get(guId, out fileObj0);
                   fileObj0.ReadSize = fileObj0.ReadSize + block;
                   fileObj0.Status = SendFileStatus.Reading;
                                

                   // 尝试读取一个字节
                   int nextByte = stream.ReadByte();
                   // 读取失败则说明读取完成可以返回结果
                   if (nextByte == -1)
                   {
                       fileBlock.EndFlag = true;
                       //FilesQueue.Instance.Get(guId, out fileObj0);
                       fileObj0.Status = SendFileStatus.ReadEnd;
                       FilesQueue.Instance.Add(guId, fileObj0);
                       TransferSendFileObj2 fileObj2 = new TransferSendFileObj2();
                       fileObj2.BlockNum = _order_Num;
                       fileObj2.DataBlockCount = _order_Num;
                       fileObj2.FileName = fileObj0.FileName;
                       fileObj2.FilePath = fileObj0.FilePath;
                       fileObj2.FileSize = fileObj0.FileSize;
                       fileObj2.ReadSize = fileObj0.ReadSize;
                       fileObj2.SendSize = fileObj0.SendSize;
                       fileObj2.serverDir = fileObj0.serverDir;
                       fileObj2.Status = fileObj0.Status;
                       UpLoadFileMsg(new UpLoadFileEventArgs(guId, fileObj2));
                   }
                   else
                   {
                       fileBlock.EndFlag = false;
                       fileObj0.Status = SendFileStatus.Reading;
                       TransferSendFileObj2 fileObj2 = new TransferSendFileObj2();
                       fileObj2.BlockNum = _order_Num;
                       fileObj2.DataBlockCount = 0;
                       fileObj2.FileName = fileObj0.FileName;
                       fileObj2.FilePath = fileObj0.FilePath;
                       fileObj2.FileSize = fileObj0.FileSize;
                       fileObj2.ReadSize = fileObj0.ReadSize;
                       fileObj2.SendSize = fileObj0.SendSize;
                       fileObj2.serverDir = fileObj0.serverDir;
                       fileObj2.Status = fileObj0.Status;
                       UpLoadFileMsg(new UpLoadFileEventArgs(guId, fileObj2));
                   }
                   FilesQueue.Instance.Add(guId, fileObj0); 
                   stream.Seek(-1, SeekOrigin.Current);
                 
                   //清空缓存区
                   Array.Clear(buffer, 0, buffer.Length);
                   byteLength = 0;
               }              
           }
           //压入文件块传输缓存队列
           TransferFileDataObj fileBlockEnd = new TransferFileDataObj();
           fileBlockEnd.guId = guId;
           Array.Copy(buffer, fileBlockEnd.FileData, byteLength);
           fileBlockEnd.FilePath = FilePath;
           fileBlockEnd.CanReadLength = byteLength;
           fileBlockEnd.Order_Num = _order_Num;
           fileBlockEnd.FileName = FileName;
           fileBlockEnd.EndFlag = true;
           FilesBlocksQueue.Instance.Add(fileBlockEnd);
           //Utility.Log.Log.writeLineToLog("读取文件--尾块入队列:" + _order_Num.ToString(), "Read");
           //更新Files队列中,对应File的ReadSize    
           FilesQueue.Instance.Get(guId, out fileObj0);
           fileObj0.ReadSize = fileObj0.ReadSize + byteLength;
           fileObj0.Status = SendFileStatus.ReadEnd;
           fileObj0.DataBlockCount = fileBlockEnd.Order_Num;
           FilesQueue.Instance.Add(guId, fileObj0);
           TransferSendFileObj2 fileObj3 = new TransferSendFileObj2();
           fileObj3.BlockNum = _order_Num;
           fileObj3.DataBlockCount = 0;
           fileObj3.FileName = fileObj0.FileName;
           fileObj3.FilePath = fileObj0.FilePath;
           fileObj3.FileSize = fileObj0.FileSize;
           fileObj3.ReadSize = fileObj0.ReadSize;
           fileObj3.SendSize = fileObj0.SendSize;
           fileObj3.serverDir = fileObj0.serverDir;
           fileObj3.Status = fileObj0.Status;
           UpLoadFileMsg(new UpLoadFileEventArgs(guId, fileObj3));
           //清空缓存区
           Array.Clear(buffer, 0, buffer.Length);
       }
 private static void NewThreadFunc(Thread ParObject)
 {
     RunFlag = false;
     while (!RunFlag)
     {              
         TransferFileDataObj item = null;
         if (PCClientFilesBlocksQueue.TryPeek(out item))
         {
             if (item != null)
             {
                 if (FileTransferClient.ClientSendFileDataBlock(item))
                 {
                     TransferFileDataObj block = null;
                     if (PCClientFilesBlocksQueue.TryDequeue(out block))
                     {
                         Interlocked.Decrement(ref queueLength);
                         TransferSendFileObj fileObj = new TransferSendFileObj();
                         FilesQueue.Instance.Get(block.guId, out fileObj);
                         if (fileObj != null && block != null)
                         {
                             fileObj.SendSize = fileObj.SendSize + block.FileData.Length;
                             if (item.Order_Num == 1)
                             {
                                 fileObj.Status = SendFileStatus.StartSend;
                             }
                             else {
                                 fileObj.Status = SendFileStatus.Sending;
                             }
                             if (fileObj.FileSize == fileObj.SendSize)
                             {
                                 fileObj.Status = SendFileStatus.SendEnd;
                             }
                             FilesQueue.Instance.Add(block.guId, fileObj);
                             TransferSendFileObj2 fileObj2 = new TransferSendFileObj2();
                             fileObj2.BlockNum = item.Order_Num;
                             fileObj2.DataBlockCount = fileObj.DataBlockCount;
                             fileObj2.FileName = fileObj.FileName;
                             fileObj2.FilePath = fileObj.FilePath;
                             fileObj2.FileSize = fileObj.FileSize;
                             fileObj2.ReadSize = fileObj.ReadSize;
                             fileObj2.SendSize = fileObj.SendSize;
                             fileObj2.serverDir = fileObj.serverDir;
                             fileObj2.Status = fileObj.Status;
                             FileTransferClient.UpLoadFileMsg(new UpLoadFileEventArgs(block.guId, fileObj2));
                         }
                     }
                 }
             }
         }
     }
     //RunFlag = true;
     ////Utility.Log.Log.writeLineToLog("发送线程终止000:" , "Send");
     ////Thread.Sleep(3000);
     //ParObject.Abort();
     //ParObject = null;
 }
 /// <summary>
 /// 上传文件
 /// </summary>
 /// <param name="filePath">文件路径</param>
 /// <param name="guId"></param>
 /// <param name="serverDir"></param>
  public static void ClientUpLoadFile(string filePath, string guId, string serverDir)
 {
     string fileName = Path.GetFileName(filePath);
     string fileNameWithoutExt = Path.GetFileNameWithoutExtension(filePath);
     string fileType = Path.GetExtension(filePath);
     FileInfo fileInfo = new FileInfo(filePath);           
     using(FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
     {
         TransferSendFileObj fileObj = new TransferSendFileObj();
         fileObj.FileName = fileName;
         fileObj.FilePath = filePath;
         fileObj.FileSize = fileInfo.Length;
         fileObj.ReadSize = 0;
         fileObj.SendSize = 0;
         fileObj.Status = SendFileStatus.StartRead;
         fileObj.serverDir = serverDir;
         FilesQueue.Instance.Add(guId, fileObj);
         AddIdList(guId);
         TransferSendFileObj2 fileObj2 = new TransferSendFileObj2();
         fileObj2.BlockNum = 0;
         fileObj2.DataBlockCount = 0;
         fileObj2.FileName = fileObj.FileName;
         fileObj2.FilePath = fileObj.FilePath;
         fileObj2.FileSize = fileObj.FileSize;
         fileObj2.ReadSize = fileObj.ReadSize;
         fileObj2.SendSize = fileObj.SendSize;
         fileObj2.serverDir = fileObj.serverDir;
         fileObj2.Status = fileObj.Status;
         UpLoadFileMsg(new UpLoadFileEventArgs(guId,fileObj2));
         InitUpLoadTimer();
         SafeReadFile(fs, guId, fileName, filePath);
     }
     //byte[] data = new byte[fs.Length];
     //fs.Read(data, 0, data.Length);
 }
        private static void NewThreadFunc()
        {
            //RunFlag = false;
            while (true)
            {
                TransferFileDataObj item = null;
                if (PCClientFilesBlocksQueue.TryPeek(out item))
                {
                    if (item != null)
                    {
                        if (FileTransferClient.ClientSendFileDataBlock(item))
                        {
                            TransferFileDataObj block = null;
                            if (PCClientFilesBlocksQueue.TryDequeue(out block))
                            {
                                Interlocked.Decrement(ref queueLength);
                                TransferSendFileObj fileObj = new TransferSendFileObj();
                                FilesQueue.Instance.Get(block.guId, out fileObj);
                                if (fileObj != null && block != null)
                                {

                                    fileObj.SendSize = fileObj.SendSize + block.CanReadLength;
                                    if (item.Order_Num == 1)
                                    {
                                        fileObj.Status = SendFileStatus.StartSend;
                                    }
                                    else
                                    {
                                        fileObj.Status = SendFileStatus.Sending;
                                    }
                                    if (fileObj.FileSize == fileObj.SendSize)
                                    {
                                        fileObj.Status = SendFileStatus.SendEnd;
                                    }
                                    FilesQueue.Instance.Add(block.guId, fileObj);
                                    TransferSendFileObj2 fileObj2 = new TransferSendFileObj2();
                                    fileObj2.BlockNum = item.Order_Num;
                                    fileObj2.DataBlockCount = fileObj.DataBlockCount;
                                    fileObj2.FileName = fileObj.FileName;
                                    fileObj2.FilePath = fileObj.FilePath;
                                    fileObj2.FileSize = fileObj.FileSize;
                                    fileObj2.ReadSize = fileObj.ReadSize;
                                    fileObj2.SendSize = fileObj.SendSize;
                                    fileObj2.serverDir = fileObj.serverDir;
                                    fileObj2.Status = fileObj.Status;
                                    FileTransferClient.UpLoadFileMsg(new UpLoadFileEventArgs(block.guId, fileObj2));
                                }
                            }
                        }
                    }
                }
            }        
        }