Пример #1
0
        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);
            //}
        }
Пример #2
0
 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();
     //}
 }
Пример #3
0
 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;
 }
Пример #4
0
        //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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 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));
                         }
                     }
                 }
             }
         }
     }
 }
Пример #7
0
        //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);
        }
Пример #8
0
        //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);
        }
Пример #9
0
        private void WriteFile2(string guId, TransferReceiveFileObj fileObj0, Thread myThread)
        {
            FileStream             fsWrite    = null;
            long                   fileSize   = 0;
            bool                   firstWrite = true;
            TransferReceiveFileObj fileObjAim = fileObj0;

            while (true)
            {
start:
                if (!firstWrite)
                {
                    TransferReceiveFileObj fileObj1 = new TransferReceiveFileObj();
                    FilesQueue.Get(guId, out fileObj1);
                    fileObjAim = fileObj1;

                    if ((System.DateTime.Now - fileObjAim.writeTime).TotalMinutes > 3)//写入等待超时3分钟
                    {
                        if (fsWrite != null)
                        {
                            fsWrite.Close();
                            fsWrite.Dispose();
                        }
                        //Utility.Log.Log.writeLineToLog("写入文件--尾块:" + block.Order_Num.ToString(), "Write" + guId);
                        fileObjAim.Status = ReceiveFileStatus.WriteWaitTimeOut;
                        FilesQueue.Add(guId, fileObjAim);
                        //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId);
                        Thread.Sleep(300);
                        myThread.Abort();
                        myThread = null;
                    }
                }


                for (int i = 0; i < ServerFilesBlocksBag.Count; i++)
                {
                    TransferFileDataObj block = ServerFilesBlocksBag.ElementAt <TransferFileDataObj>(i);
                    if (block.Order_Num != fileObjAim.NextDataBlockNum)
                    {
                        return;
                    }
                    if (guId != block.guId)
                    {
                        return;
                    }

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

                    //}
                    // Utility.Log.Log.writeLineToLog("写入文件:" + block.Order_Num.ToString(), "Write" + guId);
                    //fsWrite.Seek((block.Order_Num - 1) * 32768, SeekOrigin.Begin);
                    //if (block.Order_Num == 1)
                    //{
                    //    fsWrite.Seek(0, SeekOrigin.Begin);
                    //}
                    //else {
                    //    fsWrite.Seek(0, SeekOrigin.End);
                    //}
                    fsWrite.Write(block.FileData, 0, block.CanReadLength);
                    fileSize = fileSize + block.CanReadLength;
                    //}
                    fileObjAim.Status    = ReceiveFileStatus.Writing;
                    fileObjAim.writeTime = System.DateTime.Now;
                    if (fileSize == fileObjAim.FileSize)//完整写入
                    {
                        fsWrite.Close();
                        fsWrite.Dispose();
                        //Utility.Log.Log.writeLineToLog("写入文件--尾块:" + block.Order_Num.ToString(), "Write" + guId);
                        fileObjAim.Status = ReceiveFileStatus.WriteEnd;
                        //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId);
                        Thread.Sleep(300);
                        myThread.Abort();
                        myThread = null;
                    }
                    fileObjAim.WriteSize        = fileObjAim.WriteSize + block.FileData.Length;;
                    fileObjAim.NextDataBlockNum = fileObjAim.NextDataBlockNum + 1;
                    FilesQueue.Add(guId, fileObjAim);
                    //ServerFilesBlocksQueue.TryDequeue(out block);
                    ServerFilesBlocksBag.TryTake(out block);
                    //Thread.Sleep(50);
                }
                goto start;
            }
        }
Пример #10
0
        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);
        }
Пример #11
0
 public bool Remove(out TransferFileDataObj obj)
 {
     //return ServerFilesBlocksQueue.TryDequeue(out obj);
     return(ServerFilesBlocksBag.TryTake(out obj));
 }
Пример #12
0
 public bool Get(out TransferFileDataObj obj)
 {
     //return ServerFilesBlocksQueue.TryPeek(out obj);
     return(ServerFilesBlocksBag.TryPeek(out obj));
 }
Пример #13
0
        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);
        }