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);
       }
        public void Add(TransferFileDataObj item)
        {
            PCClientFilesBlocksQueue.Enqueue(item);
            Interlocked.Increment(ref queueLength);
            //if (RunFlag)
            //{
            //    ThreadPool.QueueUserWorkItem(new WaitCallback(NewThreadFunc));
            //}

            //if (RunFlag)
            //{
            lock (lockerRunFlag)
            {
                if (sendFileThread == null)
                {
                    sendFileThread = new Thread(new ThreadStart(NewThreadFunc));
                    sendFileThread.IsBackground = true;
                    sendFileThread.Start();
                }
            }
            //}
            //if (RunFlag)
            //{
            //    ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
            //    Thread myThread = new Thread(ParStart);
            //    myThread.IsBackground = true;
            //    object o = myThread;
            //    myThread.Start(o);
            //}
        }
       //private static void loadData(string path, string fileName, string guId)
       //{
       //    DownLoadFileDataObj obj = new DownLoadFileDataObj();
       //    if (GlobalStaticObj.Instance.proxyFile.GetSucDataBlock(guId))
       //    {
       //        DownLoadFileOoj_Client fileObj = new DownLoadFileOoj_Client();
       //        fileObj.FileName = fileName;
       //        fileObj.guId = guId;
       //        fileObj.DownLoadStatus = GetFileDownLoadStatus.StartDownLoad;
       //        fileObj.DownLoadSize = 0;
       //        DownLoadFilesQueue.Instance.Add(guId, fileObj);
       //        DownLoadFileMsg(new DownLoadFileEventArgs(guId,fileObj));

       //        getFileDataBlocks(path, fileName, guId, out obj);
       //        if (!obj.EndFlag)
       //        {
       //            loadData(path, fileName, guId);
       //        }
       //        else
       //        {
       //        DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client();
       //        fileObj0.FileName = fileName;
       //        fileObj0.guId = guId;
       //        fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd;
       //        DownLoadFilesQueue.Instance.Add(guId, fileObj0);
       //        DownLoadFileMsg(new DownLoadFileEventArgs(guId,fileObj0));
       //            return;
       //        }
       //    }
       //    else {
       //        loadData(path, fileName, guId);
       //    }
       //}

       // private static void getFileDataBlocks(string path, string fileName, string guId, out DownLoadFileDataObj obj0)
       //{
       //  string resultStr = GlobalStaticObj.Instance.proxyFile.DownLoadFileDataBlock(path, fileName, guId);
       //  DownLoadFileDataObj obj = JsonConvert.DeserializeObject<DownLoadFileDataObj>(resultStr);
       //  if (!string.IsNullOrEmpty(resultStr))
       //  {
       //      obj0 = obj;
       //      DownLoadFilesBlocksQueue.Instance.Add(obj);  
       //      DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client();
       //        fileObj0.FileName = fileName;
       //        fileObj0.guId = guId;
       //        fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd;
       //        fileObj0.DownLoadSize =  fileObj0.DownLoadSize + obj.FileData.Length;
       //        DownLoadFilesQueue.Instance.Add(guId, fileObj0);
       //        DownLoadFileMsg(new DownLoadFileEventArgs(guId,fileObj0));
       //  }
       //  if(obj.EndFlag)
       //  {
       //      obj0 = obj;
       //      DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client();
       //      fileObj0.FileName = fileName;
       //      fileObj0.guId = guId;
       //      fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd;
       //      fileObj0.DownLoadSize = fileObj0.DownLoadSize + obj.FileData.Length;
       //      DownLoadFilesQueue.Instance.Add(guId, fileObj0);
       //      DownLoadFileMsg(new DownLoadFileEventArgs(guId, fileObj0));
       //      return; 
       //  }
       //  getFileDataBlocks(path,fileName,guId,out obj0);
       //}

        //private static void getFileDataBlocks(string guId)
        //{
        //    string resultStr = GlobalStaticObj.Instance.proxyFile.DownLoadFileDataBlock(guId);
        //    DownLoadFileDataObj obj = JsonConvert.DeserializeObject<DownLoadFileDataObj>(resultStr);
        //    if (!string.IsNullOrEmpty(resultStr))
        //    {
        //        DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client();
        //        DownLoadFilesQueue.Instance.Get(obj.guId, out fileObj0);
        //        DownLoadFilesBlocksQueue.Instance.Add(obj);              
        //        fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd;
        //        fileObj0.DownLoadSize = fileObj0.DownLoadSize + obj.FileData.Length;
        //        DownLoadFilesQueue.Instance.Add(guId, fileObj0);
        //        DownLoadFileMsg(new DownLoadFileEventArgs(guId, fileObj0));
        //    }
        //    if (obj.EndFlag)
        //    {
        //        obj0 = obj;
        //        DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client();
        //        fileObj0.FileName = fileName;
        //        fileObj0.guId = guId;
        //        fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd;
        //        fileObj0.DownLoadSize = fileObj0.DownLoadSize + obj.FileData.Length;
        //        DownLoadFilesQueue.Instance.Add(guId, fileObj0);
        //        DownLoadFileMsg(new DownLoadFileEventArgs(guId, fileObj0));
        //        return;
        //    }
        //    getFileDataBlocks(path, fileName, guId, out obj0);
        //}

       

       public static bool ClientSendFileDataBlock(TransferFileDataObj item)
       {
           bool result = false;
           if (WCFClientProxy.TestPCClientProxy())
           {
               TransferSendFileObj fileObj =  new TransferSendFileObj();
               FilesQueue.Instance.Get(item.guId, out fileObj);
               string resultStr = GlobalStaticObj.Instance.proxyFile.ReceiveFile(item.FileData,item.CanReadLength, item.FilePath, item.FileName, item.Order_Num, item.guId, fileObj.serverDir, fileObj.FileSize, item.EndFlag, fileObj.DataBlockCount,UserId, PCClientCookieStr);             
               bool.TryParse(resultStr, out result);
               if (FilesBlocksQueue.PCClientFilesBlocksQueue.IsEmpty)
               {
                   FilesBlocksQueue.RunFlag = true;                   
                   //Utility.Log.Log.writeLineToLog("发送线程终止:" + item.Order_Num.ToString() + " 结果:" + result.ToString(), "Send");
               }
               //Utility.Log.Log.writeLineToLog("发送文件块:" + item.Order_Num.ToString() + " 结果:" + result.ToString(), "Send");
           }
           return result;
       }
 private static void WriteRestFile(string guId, TransferReceiveFileObj fileObj0,TransferFileDataObj block)
 {
     if (block.Order_Num != fileObj0.NextDataBlockNum)
     {
         return;
     }
     if (!Directory.Exists(Instance.SavePath))//存放的默认文件夹是否存在
     {
         Directory.CreateDirectory(Instance.SavePath);//不存在则创建
     }
     string fileFullPath = Path.Combine(Instance.SavePath + fileObj0.serverDir, fileObj0.FileName);//合并路径生成文件存放路径
     //创建文件流,读取流中的数据生成文件
     //lock (SynWriteObject)
     //{
     FileStream fs = new FileStream(fileFullPath, FileMode.Append, FileAccess.Write, FileShare.Write);
         //Utility.Log.Log.writeLineToLog("写入文件:" + block.Order_Num.ToString(), "Write" + guId);
         fs.Write(block.FileData, 0, block.CanReadLength);
         fs.Close();
         fs.Dispose();
     //}
         fileObj0.Status = ReceiveFileStatus.Writing;
         if (block.EndFlag)
         {
             //Utility.Log.Log.writeLineToLog("写入文件--尾块:" + block.Order_Num.ToString(), "Write" + guId);
             fileObj0.Status = ReceiveFileStatus.WriteEnd;               
         }
         fileObj0.WriteSize = fileObj0.WriteSize + block.FileData.Length; ;
         fileObj0.NextDataBlockNum = fileObj0.NextDataBlockNum+1;
         FilesQueue.Add(guId, fileObj0);
         //ServerFilesBlocksQueue.TryDequeue(out block);
         ServerFilesBlocksBag.TryTake(out block); 
 }
        //FileStream fsWriteAppend = null;
        private void WriteRestFile(string guId, TransferReceiveFileObj fileObj0, TransferFileDataObj block0, Thread myThread)
        {
            FileStream fsWriteAppend = null;
            for (int i=0;i<ServerFilesBlocksBag.Count;i++)
            {
                TransferFileDataObj block = ServerFilesBlocksBag.ElementAt <TransferFileDataObj>(i);
                if (block0.Order_Num != fileObj0.NextDataBlockNum)
                {
                    return;
                }
                if (guId != block.guId)
                {
                    return;
                }

                if (!Directory.Exists(Instance.SavePath))//存放的默认文件夹是否存在
                {
                    Directory.CreateDirectory(Instance.SavePath);//不存在则创建
                }
                string fileFullPath = Path.Combine(Instance.SavePath + fileObj0.serverDir, fileObj0.FileName);//合并路径生成文件存放路径
                //创建文件流,读取流中的数据生成文件
                //lock (SynWriteObject)
                //{
                //fsWriteAppend.Lock(
                if (fsWriteAppend == null)
                {
                fsWriteAppend = new FileStream(fileFullPath, FileMode.Append, FileAccess.Write, FileShare.Write);
                }
                //else { 

                //}
                // Utility.Log.Log.writeLineToLog("写入文件:" + block.Order_Num.ToString(), "Write" + guId);
                fsWriteAppend.Seek((block.Order_Num - 1) * 32768, SeekOrigin.Begin);
                fsWriteAppend.Write(block.FileData, 0, block.CanReadLength);
                fsWriteAppend.Close();
                fsWriteAppend.Dispose();
                //}
                fileObj0.Status = ReceiveFileStatus.Writing;
                if (block.EndFlag)
                {
                    //Utility.Log.Log.writeLineToLog("写入文件--尾块:" + block.Order_Num.ToString(), "Write" + guId);
                    fileObj0.Status = ReceiveFileStatus.WriteEnd;
                    //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId);
                    Thread.Sleep(300);
                    myThread.Abort();
                    myThread = null;
                }
                fileObj0.WriteSize = fileObj0.WriteSize + block.FileData.Length; ;
                fileObj0.NextDataBlockNum = fileObj0.NextDataBlockNum + 1;
                FilesQueue.Add(guId, fileObj0);
                //ServerFilesBlocksQueue.TryDequeue(out block);
                ServerFilesBlocksBag.TryTake(out block);
                //Thread.Sleep(50);
            }
        }
 //FileStream fsWriteNew = null;
 private void WriteNewFile(string guId, TransferReceiveFileObj fileObj0, TransferFileDataObj block, Thread myThread)
 {
     if (!Directory.Exists(Path.Combine(Instance.SavePath + fileObj0.serverDir)))//存放的默认文件夹是否存在
     {
         Directory.CreateDirectory(Path.Combine(Instance.SavePath + fileObj0.serverDir));//不存在则创建
     }
     string fileFullPath = Path.Combine(Instance.SavePath + fileObj0.serverDir, fileObj0.FileName);//合并路径生成文件存放路径
     //创建文件流,读取流中的数据生成文件
     int offset = 0;
     //lock (SynWriteObject)
     //{
     //if (fsWriteNew == null)
     //{
         FileStream fsWriteNew = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write, FileShare.Write);
     //}
         //Utility.Log.Log.writeLineToLog("开始写入文件:" + block.Order_Num.ToString(), "Write" + guId);
         fsWriteNew.Seek(0, SeekOrigin.Begin);
         fsWriteNew.Write(block.FileData, 0, block.CanReadLength);
         fsWriteNew.Close();
         fsWriteNew.Dispose();
     //}
     offset = offset + block.FileData.Length;
     fileObj0.Status = ReceiveFileStatus.StartWrite;
     if (block.EndFlag)
     {
         //Utility.Log.Log.writeLineToLog("写入文件--尾块:" + block.Order_Num.ToString(), "Write" + guId);
         fileObj0.Status = ReceiveFileStatus.WriteEnd;
         //Utility.Log.Log.writeLineToLog("写入线程终止--New点:" + block.Order_Num.ToString(), "Write" + guId);
         Thread.Sleep(300);
         myThread.Abort();
         myThread = null;
     }
     fileObj0.WriteSize = offset;
     fileObj0.NextDataBlockNum = 2;
     FilesQueue.Add(guId, fileObj0);
     //ServerFilesBlocksQueue.TryDequeue(out block);
     ServerFilesBlocksBag.TryTake(out block); 
 }
 public bool Remove(out TransferFileDataObj obj)
 {
     //return ServerFilesBlocksQueue.TryDequeue(out obj);
     return ServerFilesBlocksBag.TryTake(out obj);
 }
 public bool Get(out TransferFileDataObj obj)
 {
   //return ServerFilesBlocksQueue.TryPeek(out obj);
     return ServerFilesBlocksBag.TryPeek(out obj);
 }
 public void Add(TransferFileDataObj item)
 {
     //ServerFilesBlocksQueue.Enqueue(item);
     ServerFilesBlocksBag.Add(item);
     Interlocked.Increment(ref queueLength);
     //if (RunFlag)
     //{
     //    ThreadPool.QueueUserWorkItem(new WaitCallback(NewThreadFunc));
     //}
     lock (lockerRunFlag)
     {
         if (item.Order_Num == 1)
         {
             ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
             Thread myThread = new Thread(ParStart);
             myThread.IsBackground = true;
             FileThreadPramObj o = new FileThreadPramObj();
             o.guId=item.guId;
             o.myThread = myThread;
             myThread.Start(o);
         }
     }
     //if (RunFlag)
     //{
     //    writeFileThread = new Thread(new ThreadStart(NewThreadFunc));
     //    writeFileThread.IsBackground = true;
     //    writeFileThread.Start();
     //}
 }
 public string ReceiveFile(byte[] fileDataArry, int CanReadLength, string path, string fileName, int Order_Num, string guId, string serverDir, long fileSize, bool EndFlag, int DataBlockCount, string UserID, string PCClientCookieStr)
 {
     if (!SessionCookie.CheckPCClientCookieStr(UserID, PCClientCookieStr))
     {
         return "Session Error";
     }
     string result = string.Empty;
     result = "false";
     TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
     if (!FilesQueue.Get(guId, out fileObj0))
     {
         fileObj0 = new TransferReceiveFileObj();
         fileObj0.guId = guId;
         fileObj0.FileName = fileName;
         fileObj0.FilePath = path;
         fileObj0.FileSize = fileSize;
         fileObj0.ReceiveSize = 0;
         fileObj0.Status = ReceiveFileStatus.StartReceive;
         fileObj0.DataBlockCount = DataBlockCount;
         fileObj0.serverDir = serverDir;
         fileObj0.NextDataBlockNum = 1;
         FilesQueue.Add(guId, fileObj0);
     }
     //int len = fileDataArry.Length;
     TransferFileDataObj fileBlock = new TransferFileDataObj();
     fileBlock.guId = guId;
     Array.Copy(fileDataArry, fileBlock.FileData, CanReadLength);
     fileBlock.CanReadLength = CanReadLength;
     fileBlock.FilePath = path;
     fileBlock.Order_Num = Order_Num;
     FilesBlocksQueue.Instance.Add(fileBlock);
     if (!EndFlag)
     {
         //Utility.Log.Log.writeLineToLog("接收文件--入队列:" + Order_Num.ToString(), "Receive");
     }
     FilesQueue.Get(guId, out fileObj0);
     if (EndFlag)
     {
         fileObj0.Status = ReceiveFileStatus.ReceiveEnd;
         //Utility.Log.Log.writeLineToLog("接收文件--尾块入队列:" + Order_Num.ToString(), "Receive");
     }
     else {
         if (fileObj0.Status == ReceiveFileStatus.StartReceive)
         {
             fileObj0.Status = ReceiveFileStatus.Receiving;
         }
     }
     fileObj0.ReceiveSize = fileObj0.ReceiveSize + CanReadLength;
     FilesQueue.Add(guId, fileObj0);
     result = "true";
     return result;
 }