示例#1
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();
     //}
 }
示例#2
0
        // 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;
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        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);
        }
示例#4
0
 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);
         }
     }
 }
示例#5
0
 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);
     }
 }
示例#6
0
        //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;
            }
        }
示例#7
0
        //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;
            }
        }
示例#8
0
        //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);
            }
        }