コード例 #1
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;
 }
コード例 #2
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));
                         }
                     }
                 }
             }
         }
     }
 }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
 public UpLoadFileEventArgs(String guid, TransferSendFileObj2 obj)
 {
     _guid        = guid;
     _sendFileObj = obj;
 }
コード例 #5
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);
        }