示例#1
0
 private static void findEndFlagFileBlock()
 {
     foreach (TransferFileDataObj block in ServerFilesBlocksBag)
     //foreach (TransferFileDataObj block in ServerFilesBlocksQueue)
     {
         if (block.Order_Num == 1)
         {
             TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
             FilesQueue.Get(block.guId, out fileObj0);
             //Action<string, TransferReceiveFileObj,TransferFileDataObj> generateNewFile = WriteNewFile;
             //generateNewFile.BeginInvoke(block.guId, fileObj0,block, null, null);
             WriteNewFile(block.guId, fileObj0, block);
         }
         else
         {
             //if (block.EndFlag)
             //{
             TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
             FilesQueue.Get(block.guId, out fileObj0);
             //Action<string, TransferReceiveFileObj,TransferFileDataObj> generateRestFile = WriteRestFile;
             //generateRestFile.BeginInvoke(block.guId, fileObj0,block, null, null);
             //}
             if (block.Order_Num == fileObj0.NextDataBlockNum)
             {
                 WriteRestFile(block.guId, fileObj0, block);
             }
         }
     }
 }
示例#2
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);
        }
示例#3
0
 /// <summary>
 /// 切记:引用完类组件后,一定要调用此方法来释放!
 /// </summary>
 public static void Dispose()
 {
     FilesQueue.Dispose();
     FilesBlocksQueue.Dispose();
     DownLoadFilesQueue.Dispose();
     DownLoadFilesBlocksQueue.Dispose();
 }
示例#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
 /// <summary>
 /// 清理所有正在使用的资源。
 /// </summary>
 /// <param name="isDisposing">如果应释放托管资源,为 true;否则为 false</param>
 protected static void Dispose(bool isDisposing)
 {
     if (_alreadyDisposed)
     {
         return;
     }
     if (isDisposing)
     {
         _serverFilesDic = null;
         _instance       = null;
         //GC.SuppressFinalize(this);
     }
     _alreadyDisposed = true;
 }
示例#7
0
        //private static bool occupyFlag = true;
        //public string ReceiveFile2(byte[] fileDataArry,int CanReadLength, string fileName, string guId, string serverDir, bool EndFlag)
        //{

        //    //ParameterizedThreadStart ParStart = new ParameterizedThreadStart(ThreadMethod);
        //    //Thread myThread = new Thread(ParStart);
        //    //myThread.IsBackground = true;
        //    //FileThreadObj thObj = new FileThreadObj();
        //    //thObj.CanReadLength = CanReadLength;
        //    //thObj.fileDataArry = fileDataArry;
        //    //thObj.fileName = fileName;
        //    //thObj.guId = guId;
        //    //thObj.serverDir = serverDir;
        //    //thObj.EndFlag = EndFlag;
        //    //thObj.myThread = myThread;
        //    //object o = thObj;
        //    //myThread.Start(o);

        //    string result = string.Empty;
        //    result = "false";
        //    if (!Directory.Exists(Path.Combine(SavePath + serverDir)))
        //    {
        //        Directory.CreateDirectory(Path.Combine(SavePath + serverDir));
        //    }
        //    string fileFullPath = Path.Combine(SavePath + serverDir, fileName);
        //    //创建文件流,读取流中的数据生成文件
        //    if (!File.Exists(fileFullPath))
        //    {
        //        while (occupyFlag)
        //        {
        //            try
        //            {
        //                FileStream fs = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write, FileShare.None);
        //                fs.Write(fileDataArry, 0, CanReadLength);
        //                fs.Close();
        //                fs.Dispose();
        //                result = "true";
        //                occupyFlag = false;
        //            }
        //            catch
        //            {
        //            }
        //        }
        //        occupyFlag = true;
        //    }
        //    else {
        //        //while (guidFileDic[guId])
        //        //{
        //        //    continue;
        //        //}
        //        //guidFileDic.TryUpdate(guId, true, false);
        //        while (occupyFlag)
        //        {
        //            try
        //            {
        //                FileStream fs = new FileStream(fileFullPath, FileMode.Append, FileAccess.Write, FileShare.None);
        //                fs.Write(fileDataArry, 0, CanReadLength);
        //                fs.Close();
        //                fs.Dispose();
        //                result = "true";
        //                occupyFlag = false;
        //            }
        //            catch
        //            {
        //            }
        //        }
        //    }
        //    if (EndFlag)
        //    {

        //    }
        //    return result;
        //}


        public string GetUploadFileStatus(string[] fileGuId, string UserID, string PCClientCookieStr)
        {
            if (SessionCookie.CheckPCClientCookieStr(UserID, PCClientCookieStr))
            {
                string result = string.Empty;
                List <TransferReceiveFileObj> myList = new List <TransferReceiveFileObj>();
                TransferReceiveFileObj        obj    = null;
                foreach (string id in fileGuId)
                {
                    FilesQueue.Get(id, out obj);
                    myList.Add(obj);
                }
                return(Newtonsoft.Json.JsonConvert.SerializeObject(myList));
            }
            else
            {
                return("Session Error");
            }
        }
示例#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 findEndFlagFileBlock(Thread myThread)
        {
            //TransferFileDataObj block = new TransferFileDataObj();
            //if(ServerFilesBlocksQueue.TryPeek(out block)){
            //foreach (TransferFileDataObj block in ServerFilesBlocksQueue)
            //{

            //foreach (TransferFileDataObj block in ServerFilesBlocksBag)
            //{
            //    if (block.Order_Num == 1)
            //    {
            //        TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
            //        FilesQueue.Get(block.guId, out fileObj0);
            //        WriteNewFile(block.guId, fileObj0, block,myThread);
            //    }
            //    else
            //    {
            //        TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
            //        FilesQueue.Get(block.guId, out fileObj0);
            //        if (block.Order_Num == fileObj0.NextDataBlockNum)
            //        {
            //            WriteRestFile(block.guId, fileObj0, block,myThread);
            //        }
            //    }
            ////}
            //}

            foreach (TransferFileDataObj block in ServerFilesBlocksBag)
            {
                if (block.Order_Num == 1)
                {
                    TransferReceiveFileObj fileObj0 = new TransferReceiveFileObj();
                    FilesQueue.Get(block.guId, out fileObj0);
                    WriteFile2(block.guId, fileObj0, myThread);
                }
            }
        }
示例#10
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;
            }
        }
示例#11
0
   /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  /// <param name="isDisposing">如果应释放托管资源,为 true;否则为 false</param>
   protected static void Dispose(bool isDisposing)
 {
     if (_alreadyDisposed)
         return;
     if (isDisposing)
     {
         _serverFilesDic = null;
         _instance = null;
        //GC.SuppressFinalize(this);
     }
     _alreadyDisposed = true;
 }