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 static bool GetFile(string path, string fileName, string guId, out string msg) //{ // if (GlobalStaticObj.Instance.proxyFile.DownLoadFile(path, fileName, guId, out msg)) // { // DownLoadFileOoj_Client fileObj = new DownLoadFileOoj_Client(); // fileObj.FileName = fileName; // fileObj.guId = guId; // fileObj.DownLoadStatus = GetFileDownLoadStatus.waiting; // DownLoadFilesQueue.Instance.Add(guId, fileObj); // DownLoadFileMsg(new DownLoadFileEventArgs(guId,fileObj)); // loadData(path, fileName, guId); // return true; // } // return false; //} private static void ThreadDownLoadMethod(object ParObject) { FileThreadPramObj o = (FileThreadPramObj)ParObject; DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client(); DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); fileObj0.DownLoadStatus = GetFileDownLoadStatus.StartDownLoad; fileObj0.DownLoadSize = 0; DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObj0)); bool firstWrite = true; while (true) { if (!firstWrite) { DownLoadFileOoj_Client fileObj1 = new DownLoadFileOoj_Client(); DownLoadFilesQueue.Instance.Get(o.guId, out fileObj1); if ((System.DateTime.Now - fileObj1.getFileTime).TotalMinutes > 3)//写入等待超时3分钟 { o.myThread.Abort(); o.myThread = null; } } DownLoadFileDataObj obj = new DownLoadFileDataObj(); if (GlobalStaticObj.Instance.proxyFile.GetSucDataBlock(o.guId, UserId, PCClientCookieStr)) { string resultStr = GlobalStaticObj.Instance.proxyFile.DownLoadFileDataBlock(o.guId, UserId, PCClientCookieStr); if (!string.IsNullOrEmpty(resultStr)) { DownLoadFileDataObj dataObj = JsonConvert.DeserializeObject <DownLoadFileDataObj>(resultStr); if (dataObj != null) { DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); firstWrite = false; DownLoadFilesBlocksQueue.Instance.Add(dataObj); fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoading; fileObj0.DownLoadSize = fileObj0.DownLoadSize + dataObj.CanReadLength; fileObj0.getFileTime = System.DateTime.Now; if (fileObj0.DownLoadSize == fileObj0.FileSize) { fileObj0.DownLoadStatus = GetFileDownLoadStatus.DownLoadEnd; } DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObj0)); if (fileObj0.DownLoadSize == fileObj0.FileSize) { Thread.Sleep(300); o.myThread.Abort(); o.myThread = null; } } } } } }
public bool DownLoadFile(string path, string fileName, string guId, string UserID, string PCClientCookieStr, out string msg, out long FileSize) { if (!SessionCookie.CheckPCClientCookieStr(UserID, PCClientCookieStr)) { msg = "Session Error"; FileSize = 0; return(false); } bool result = false; try { string fileFullPath = Path.Combine(FilesBlocksQueue.Instance.SavePath + path, fileName);//合并路径生成文件存放路径 if (!File.Exists(fileFullPath)) { msg = "File not find"; FileSize = 0; return(result); } FileInfo fileInfo = new FileInfo(fileFullPath); FileSize = fileInfo.Length; DownLoadFileOoj_Server fileObj = new DownLoadFileOoj_Server(); fileObj.FileName = fileName; fileObj.serverDir = path; fileObj.FileSize = fileInfo.Length; fileObj.ReadSize = 0; fileObj.SendSize = 0; fileObj.ReadStatus = GetFileReadStatus.StartRead; fileObj.SendStatus = GetFileSendStatus.waiting; fileObj.guId = guId; DownLoadFilesQueue.Instance.Add(guId, fileObj); msg = "File have find, reading..."; lock (mylock0) { ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod); Thread myThread = new Thread(ParStart); myThread.IsBackground = true; FileThreadPramObj o = new FileThreadPramObj(); o.guId = guId; o.myThread = myThread; myThread.Start(o); result = true; } //Action<Stream, string, string, string> readFile = SafeReadFile; //readFile.BeginInvoke(fs, guId, fileName, path, null, null); //result = true; } catch (Exception ex) { msg = "error"; result = false; throw ex; } return(result); }
public void Add(DownLoadFileDataObj item) { PCClientDownLoadFileBlocksBag.Add(item); Interlocked.Increment(ref queueLength); lock (mylock3) { if (item.Order_Num == 1) { ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadWriteFileMethod); Thread myThread = new Thread(ParStart); myThread.IsBackground = true; FileThreadPramObj o = new FileThreadPramObj(); o.guId = item.guId; o.myThread = myThread; myThread.Start(o); } } }
public static bool ClientDownLoadFile(string path, string fileName, string guId, out string msg, out long FileSize) { if (WCFClientProxy.TestPCClientProxy()) { if (GlobalStaticObj.Instance.proxyFile.DownLoadFile(path, fileName, guId, UserId, PCClientCookieStr, out msg, out FileSize)) { DownLoadFileOoj_Client fileObj = new DownLoadFileOoj_Client(); fileObj.FileName = fileName; fileObj.guId = guId; fileObj.FileSize = FileSize; fileObj.path = path; fileObj.NextDataBlockNum = 1; fileObj.DownLoadStatus = GetFileDownLoadStatus.waiting; DownLoadFilesQueue.Instance.Add(guId, fileObj); DownLoadFileMsg(new DownLoadFileEventArgs(guId, fileObj)); lock (mylock3) { ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadDownLoadMethod); Thread myThread = new Thread(ParStart); myThread.IsBackground = true; FileThreadPramObj o = new FileThreadPramObj(); o.guId = guId; o.myThread = myThread; myThread.Start(o); } return(true); } return(false); } else { msg = "无法连接服务端"; FileSize = 0; return(false); } }
//ThreadMethod如下: public void ThreadMethod(object ParObject) { FileThreadPramObj o = (FileThreadPramObj)ParObject; TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj(); FilesQueue.Get(o.guId, out fileObj0); //WriteFile2(o.guId, fileObj0, o.myThread); FileStream fsWrite = null; long fileSize = 0; bool firstWrite = true; TransferReceiveFileObj fileObjAim = fileObj0; while (true) { start: if (!firstWrite) { TransferReceiveFileObj fileObj1 = new TransferReceiveFileObj(); FilesQueue.Get(o.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(o.guId, fileObjAim); //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId); Thread.Sleep(300); o.myThread.Abort(); o.myThread = null; } } for (int i = 0; i < ServerFilesBlocksBag.Count; i++) { TransferFileDataObj block = ServerFilesBlocksBag.ElementAt <TransferFileDataObj>(i); if (block.Order_Num != fileObjAim.NextDataBlockNum) { continue; } if (o.guId != block.guId) { continue; } if (!Directory.Exists(Instance.SavePath + fileObjAim.serverDir)) //存放的默认文件夹是否存在 { Directory.CreateDirectory(Instance.SavePath + fileObjAim.serverDir); //不存在则创建 } 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 { // fsWrite.Write(block.FileData, 0, block.CanReadLength); //} //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.WriteSize = fileObjAim.WriteSize + block.CanReadLength; fileObjAim.Status = ReceiveFileStatus.WriteEnd; //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId); Thread.Sleep(300); o.myThread.Abort(); o.myThread = null; } fileObjAim.WriteSize = fileObjAim.WriteSize + block.CanReadLength; fileObjAim.NextDataBlockNum = fileObjAim.NextDataBlockNum + 1; FilesQueue.Add(o.guId, fileObjAim); //ServerFilesBlocksQueue.TryDequeue(out block); ServerFilesBlocksBag.TryTake(out block); //Thread.Sleep(50); } goto start; } }
//ThreadMethod如下: public void ThreadWriteFileMethod(object ParObject) { FileThreadPramObj o = (FileThreadPramObj)ParObject; DownLoadFileOoj_Client fileObj0 = new DownLoadFileOoj_Client(); DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); fileObj0.Status = GetFileWriteStatus.StartWrite; DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); HXCFileTransferCache_Client.FileTransferClient.DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObj0)); FileStream fsWrite = null; long fileSize = 0; bool firstWrite = true; DownLoadFileOoj_Client fileObjAim = fileObj0; while (true) { start: if (!firstWrite) { DownLoadFileOoj_Client fileObj1 = new DownLoadFileOoj_Client(); DownLoadFilesQueue.Instance.Get(o.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 = GetFileWriteStatus.WriteWaitTimeOut; DownLoadFilesQueue.Instance.Add(o.guId, fileObjAim); HXCFileTransferCache_Client.FileTransferClient.DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObjAim)); //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId); Thread.Sleep(300); o.myThread.Abort(); o.myThread = null; } } for (int i = 0; i < PCClientDownLoadFileBlocksBag.Count; i++) { DownLoadFileDataObj block = PCClientDownLoadFileBlocksBag.ElementAt <DownLoadFileDataObj>(i); if (block.Order_Num != fileObjAim.NextDataBlockNum) { continue; } if (o.guId != block.guId) { continue; } if (!Directory.Exists(DownLoadFilesBlocksQueue.Instance.SavePath)) //存放的默认文件夹是否存在 { Directory.CreateDirectory(Instance.SavePath); //不存在则创建 } string fileFullPath = Path.Combine(Application.StartupPath + "\\" + DownLoadFilesBlocksQueue.Instance.SavePath, fileObjAim.FileName); //合并路径生成文件存放路径 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); } } fsWrite.Write(block.FileData, 0, block.CanReadLength); fileSize = fileSize + block.CanReadLength; fileObjAim.Status = GetFileWriteStatus.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.WriteSize = fileObjAim.WriteSize + block.CanReadLength; fileObjAim.Status = GetFileWriteStatus.WriteEnd; DownLoadFilesQueue.Instance.Add(o.guId, fileObjAim); HXCFileTransferCache_Client.FileTransferClient.DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObjAim)); GlobalStaticObj.Instance.proxyFile.DeleteServerFileId(o.guId, FileTransferClient.UserId, FileTransferClient.PCClientCookieStr); DownLoadFilesQueue.Instance.Remove(o.guId, out fileObjAim); //Utility.Log.Log.writeLineToLog("写入线程终止--Rest点:" + block.Order_Num.ToString(), "Write" + guId); Thread.Sleep(300); o.myThread.Abort(); o.myThread = null; } fileObjAim.WriteSize = fileObjAim.WriteSize + block.CanReadLength; fileObjAim.NextDataBlockNum = fileObjAim.NextDataBlockNum + 1; DownLoadFilesQueue.Instance.Add(o.guId, fileObjAim); HXCFileTransferCache_Client.FileTransferClient.DownLoadFileMsg(new DownLoadFileEventArgs(o.guId, fileObjAim)); //ServerFilesBlocksQueue.TryDequeue(out block); PCClientDownLoadFileBlocksBag.TryTake(out block); //Thread.Sleep(50); } goto start; } }
//ThreadMethod如下: public void ThreadMethod(object ParObject) { FileThreadPramObj o = (FileThreadPramObj)ParObject; DownLoadFileOoj_Server fileObj0 = new DownLoadFileOoj_Server(); DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); //文件数据块编号 int bufferLength = 32768; int _order_Num = 0; //初始化一个32k的缓存 byte[] buffer = new byte[bufferLength]; int read = 0; int block; int byteLength = 0; //每次从流中读取缓存大小的数据,知道读取完所有的流为止 fileObj0.ReadStatus = GetFileReadStatus.StartRead; DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); string fileFullPath = Path.Combine(FilesBlocksQueue.Instance.SavePath + fileObj0.serverDir, fileObj0.FileName); //合并路径生成文件存放路径 using (FileStream stream = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { while ((block = stream.Read(buffer, 0, buffer.Length)) > 0) { byteLength = byteLength + block; //重新设定读取位置 read += block; _order_Num = _order_Num + 1; //检查是否到达了缓存的边界,检查是否还有可以读取的信息 if (block == buffer.Length) { DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); //压入文件块传输缓存队列 DownLoadFileDataObj fileBlock = new DownLoadFileDataObj(); fileBlock.guId = o.guId; Array.Copy(buffer, fileBlock.FileData, buffer.Length); fileBlock.serverDir = fileObj0.serverDir; fileBlock.Order_Num = _order_Num; fileBlock.FileName = fileObj0.FileName; fileBlock.CanReadLength = bufferLength; fileObj0.ReadSize = fileObj0.ReadSize + block; fileObj0.ReadStatus = GetFileReadStatus.Reading; // 尝试读取一个字节 int nextByte = stream.ReadByte(); // 读取失败则说明读取完成可以返回结果 if (nextByte == -1) { fileBlock.EndFlag = true; } else { fileBlock.EndFlag = false; } DownLoadFilesBlocksQueue.Instance.Add(fileBlock); //Utility.Log.Log.writeLineToLog("发送文件读取文件块:" + fileBlock.Order_Num.ToString(), "DownLoadRead"); DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); stream.Seek(-1, SeekOrigin.Current); //清空缓存区 Array.Clear(buffer, 0, buffer.Length); byteLength = 0; } } //压入文件块传输缓存队列 DownLoadFileDataObj fileBlockEnd = new DownLoadFileDataObj(); fileBlockEnd.guId = o.guId; Array.Copy(buffer, fileBlockEnd.FileData, byteLength); fileBlockEnd.serverDir = fileObj0.serverDir; fileBlockEnd.FileName = fileObj0.FileName; fileBlockEnd.Order_Num = _order_Num; fileBlockEnd.EndFlag = true; fileBlockEnd.CanReadLength = byteLength; DownLoadFilesBlocksQueue.Instance.Add(fileBlockEnd); //Utility.Log.Log.writeLineToLog("发送文件读取文件块:" + fileBlockEnd.Order_Num.ToString(), "DownLoadRead"); //更新Files队列中,对应File的ReadSize DownLoadFilesQueue.Instance.Get(o.guId, out fileObj0); fileObj0.ReadSize = fileObj0.ReadSize + byteLength; fileObj0.ReadStatus = GetFileReadStatus.ReadEnd; DownLoadFilesQueue.Instance.Add(o.guId, fileObj0); //清空缓存区 Array.Clear(buffer, 0, buffer.Length); } }