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; }
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)); } } } } } } }
/// <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); }
public UpLoadFileEventArgs(String guid, TransferSendFileObj2 obj) { _guid = guid; _sendFileObj = obj; }
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); }