Ejemplo n.º 1
0
		/// <summary>
		/// 根据任务大小信息创建任务列
		/// </summary>
		/// <param name="sizeList">尺寸大小定义</param>
		/// <returns>创建的列表</returns>
		public static FileTaskItem[] BuildTaskList(Dictionary<string, long> sizeList)
		{
			FileTaskItem[] list = new FileTaskItem[sizeList.Count];
			int index = 0;

			foreach (var key in sizeList.Keys)
			{
				list[index] = new FileTaskItem()
				{
					CancelPadding = false,
					CurrentFileSize = sizeList[key] <= 0 ? 0ul : (ulong)sizeList[key],
					CurrentFileTransfered = 0,
					CurrentName = System.IO.Path.GetFileName(key),
					EndTime = null,
					FileCount = sizeList[key] <= 0 ? 0 : 1,
					FinishedFileCount = 0,
					FinishedFolderCount = 0,
					FinishedSize = 0ul,
					FolderCount = 0,
					FullPath = key,
					Index = index,
					IsFolder = sizeList[key] <= 0,
					StartTime = null,
					State = FileTaskItemState.Scheduled,
					TotalSize = (ulong)(sizeList[key] < 0 ? -sizeList[key] : sizeList[key])
				};
				index++;
			}

			return list;
		}
Ejemplo n.º 2
0
        /// <summary>
        /// 根据任务大小信息创建任务列
        /// </summary>
        /// <param name="sizeList">尺寸大小定义</param>
        /// <returns>创建的列表</returns>
        public static FileTaskItem[] BuildTaskList(Dictionary <string, long> sizeList)
        {
            FileTaskItem[] list  = new FileTaskItem[sizeList.Count];
            int            index = 0;

            foreach (var key in sizeList.Keys)
            {
                list[index] = new FileTaskItem()
                {
                    CancelPadding         = false,
                    CurrentFileSize       = sizeList[key] <= 0 ? 0ul : (ulong)sizeList[key],
                    CurrentFileTransfered = 0,
                    CurrentName           = System.IO.Path.GetFileName(key),
                    EndTime             = null,
                    FileCount           = sizeList[key] <= 0 ? 0 : 1,
                    FinishedFileCount   = 0,
                    FinishedFolderCount = 0,
                    FinishedSize        = 0ul,
                    FolderCount         = 0,
                    FullPath            = key,
                    Index     = index,
                    IsFolder  = sizeList[key] <= 0,
                    StartTime = null,
                    State     = FileTaskItemState.Scheduled,
                    TotalSize = (ulong)(sizeList[key] < 0 ? -sizeList[key] : sizeList[key])
                };
                index++;
            }

            return(list);
        }
Ejemplo n.º 3
0
		/// <summary>
		/// 根据任务列表创建扩展信息
		/// </summary>
		/// <param name="taskList">任务列表</param>
		/// <returns>任务信息</returns>
		public static string BuildTaskMessage(FileTaskItem[] taskList)
		{
			System.Text.StringBuilder sb = new StringBuilder();

			int index = 0;
			Array.ForEach(taskList, s =>
			{
				if (s.IsFolder)
				{
					sb.AppendFormat("{0}:{1}:{2:x}:{3:x}:{4:x}:{5}", index++, s.CurrentName, s.TotalSize, DateTime.Now.ToFileTime(), (int)Define.Consts.Cmd_FileType_Option.Dir, '\a');
				}
				else
				{
					sb.AppendFormat("{0}:{1}:{2:x}:{3:x}:{4:x}:{5}", index++, s.CurrentName, s.TotalSize, DateTime.Now.ToFileTime(), (int)Define.Consts.Cmd_FileType_Option.Regular, '\a');
				}
			});

			return sb.ToString();
		}
Ejemplo n.º 4
0
		/// <summary>
		/// 接收文件夹
		/// </summary>
		/// <param name="client"></param>
		/// <param name="task"></param>
		/// <param name="item"></param>
		void PerformFileReceive_Folder(TcpClient client, FileTaskInfo task, FileTaskItem item)
		{
			TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Initializing);
			//创建网络流
			NetworkStream netStream = null;
			try
			{
				netStream = client.GetStream();
			}
			catch (Exception)
			{
				OnNetworkError(new EventArgs());
				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
				return;
			}

			bool updateTotal = item.TotalSize == 0;	//是否在更新进度的时候需要更新总数

			using (netStream)
			{
				//发送文件请求
				PackedNetworkMessage pnm = MessagePacker.BuildNetworkMessage(Message.Create(task.RemoteHost, task.RemoteHost.HostSub.Ipv4Address, Config.GetRandomTick(), Config.HostName, Config.HostUserName, Consts.Commands.GetDirFiles, 0ul, string.Format("{0:x}:{1:x}:0:", task.PackageID, item.Index), ""));
				if (!SendDataInBuffer(netStream, pnm.Data, pnm.Data.Length)) return;	//发送请求

				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Processing);
				item.StartTime = DateTime.Now;

				string filename;
				ulong size;
				bool isFolder, isRet;
				Stack<string> pathStack = new Stack<string>();
				string currentPath = item.FullPath;
				while (client.Connected && item.State != FileTaskItemState.Canceling && ReadCmdHeader(netStream, task.RemoteHost, out filename, out size, out isFolder, out isRet))
				{
					if (isRet)
					{
						if (pathStack.Count > 0)
						{
							currentPath = pathStack.Pop();
							if (pathStack.Count == 0) break; //Fixed: 当当前队列不再有信息时,其实接收已经完成了。因为当前队列中最后一个肯定是文件夹自己。
						}
						else break;
					}
					else if (isFolder)
					{
						//建立文件夹
						if (!ProcessDirCmd(item, ref currentPath, pathStack, filename, updateTotal))
						{
							TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
							return;
						}
					}
					else
					{
						//传文件
						if (!ProcessFileTransfer(client, netStream, task, item, currentPath, filename, size, updateTotal))
						{
							TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
							return;
						}
					}
				}

				netStream.Close();
			}

			if (item.State == FileTaskItemState.Canceling) TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Canceled);
			else if (item.State != FileTaskItemState.Failure) TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Finished);
		}
		/// <summary>
		/// 创建一个新的 FileReceiveEventArgs 对象.
		/// </summary>
		public FileReceiveRequiredEventArgs(FileTaskInfo task, FileTaskItem item)
		{
			Task = task;
			Item = item;
			IsHandled = false;
		}
Ejemplo n.º 6
0
		/// <summary>
		/// 向用户发送文件
		/// </summary>
		/// <param name="taskItem">文件列表</param>
		/// <param name="textMessage">附加的文本信息</param>
		/// <param name="isRtf">附加的文本信息是RTF格式</param>
		/// <param name="isHtml">附加的文本信息是HTML格式</param>
		/// <param name="remoteHost">远程主机</param>
		public void PerformSendFile(FileTaskItem[] taskItem, string textMessage, bool isRtf, bool isHtml, Host remoteHost)
		{
			FileTaskInfo task = new FileTaskInfo(FileTransferDirection.Send, 0ul, remoteHost);
			task.TaskList.AddRange(taskItem);

			task.PackageID = Commander.SendTextMessage(remoteHost, textMessage, isHtml, isRtf, false, false, false, false, taskItem.BuildTaskMessage());
			if (task.PackageID > 0) FileTaskManager.AddSendTask(task);
		}
Ejemplo n.º 7
0
		/// <summary>
		/// 标记一个任务项目状态,并检查任务是否完成
		/// </summary>
		/// <param name="item">任务条目</param>
		/// <param name="state">状态</param>
		internal void MarkSendTaskItemState(FileTaskItem item, FileTaskItemState state)
		{
			if (item.State == state) return;

			if (state == FileTaskItemState.Finished || state == FileTaskItemState.Failure)
			{
				//退出传输状态
				_activeSendItems.Remove(item);
				//强制更新状态
				OnTaskItemProgressChanged(new FileTaskEventArgs(item.TaskInfo, item));
				EnsureSendStateUpdateTimerState();
			}
			item.State = state;
			OnTaskItemStateChanged(new FileTaskEventArgs(item.TaskInfo, item));

			//是否需要更新状态
			if (state == FileTaskItemState.Processing)
			{
				_activeSendItems.Add(item);
				EnsureSendStateUpdateTimerState();
			}

			//如果是完成了,那就查找下这个任务是不是全部完成了,如果是的话,那就删掉任务
			if (state == FileTaskItemState.Finished && item.TaskInfo.TaskList.Count(s => s.State != FileTaskItemState.Finished) == 0)
			{
				OnSendTaskFinished(new FileTaskEventArgs(item.TaskInfo));
				//SendTask.Remove(item.TaskInfo.PackageID);
			}
		}
Ejemplo n.º 8
0
		/// <summary>
		/// 标记一个任务项目状态,并检查任务是否完成
		/// </summary>
		/// <param name="item">任务条目</param>
		/// <param name="state">状态</param>
		internal void MarkReceiveTaskItemState(FileTaskItem item, FileTaskItemState state)
		{
			if (item.State == state) return;

			if (state == FileTaskItemState.Finished || state == FileTaskItemState.Failure)
			{
				//退出传输状态
				this.activeReceiveItems.Remove(item);
				OnTaskItemProgressChanged(new FileTaskEventArgs(item.TaskInfo, item));
				this.EnsureReceiveStateUpdateTimerState();
			}
			item.State = state;
			OnTaskItemStateChanged(new FileTaskEventArgs(item.TaskInfo, item));

			//是否需要更新状态
			if (state == FileTaskItemState.Processing)
			{
				this.activeReceiveItems.Add(item);
				this.EnsureReceiveStateUpdateTimerState();
			}

			//如果是完成了,那就查找下这个任务是不是全部完成了,如果是的话,那就删掉任务
			if ((state == FileTaskItemState.Finished || state == FileTaskItemState.Failure))
			{
				//检测任务完成
				if (item.TaskInfo.TaskList.Count(s => s.State != FileTaskItemState.Finished && s.State != FileTaskItemState.Failure) == 0)
				{
					FileTaskInfo task = item.TaskInfo;

					this.OnReceiveTaskFinished(new FileTaskEventArgs(task));
					this.ReceiveTask.Remove(task);

					//检测是否有失败的,如果有就将请求重新发送以便重试
					for (int i = task.TaskList.Count - 1; i >= 0; i--)
					{
						if (task.TaskList[i].State != FileTaskItemState.Failure) task.TaskList.RemoveAt(i);	//如果是成功的,则移除
						else
						{
							task.TaskList[i].State = FileTaskItemState.Scheduled;							//重置任务的当前状态
							if (!task.TaskList[i].IsFolder) task.TaskList[i].FullPath = System.IO.Path.GetDirectoryName(task.TaskList[i].FullPath);
						}
					}
					if (task.TaskList.Count > 0)
					{
						var e = new FileTaskEventArgs(task);
						OnFileReceiveTaskReDroped(e);
						if (!e.IsHandled) OnFileReceiveTaskDiscarded(e);
					}
				}

				StartReceive();
			}
		}
Ejemplo n.º 9
0
		//建立文件夹
		bool ProcessDirCmd(FileTaskItem taskitem, ref string currentDirectory, Stack<string> pathStack, string folderName, bool updateTotal)
		{
			string newPath = Path.Combine(currentDirectory, folderName);
			try
			{
				Directory.CreateDirectory(newPath);
			}
			catch (Exception)
			{
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.CreateDirectory, newPath, taskitem.TaskInfo.RemoteHost));
				TaskManager.MarkReceiveTaskItemState(taskitem, FileTaskItemState.Failure);
				return false;
			}

			pathStack.Push(currentDirectory);
			currentDirectory = newPath;

			//更新进度
			taskitem.FinishedFolderCount++;
			taskitem.FolderCount++;


			return true;
		}
Ejemplo n.º 10
0
		/// <summary>
		/// 接收文件
		/// </summary>
		/// <param name="client"></param>
		/// <param name="task"></param>
		/// <param name="item"></param>
		void PerformFileReceive_File(TcpClient client, FileTaskInfo task, FileTaskItem item)
		{
			TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Initializing);
			//创建文件
			System.IO.FileInfo fileinfo = new FileInfo(item.FullPath);
			if (fileinfo.Exists) item.CurrentFileTransfered = (ulong)fileinfo.Length;
			if (item.CurrentFileSize <= item.CurrentFileTransfered)
			{
				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Finished);
				return;
			}
			//创建文件
			System.IO.FileStream writer = null;
			try
			{
				System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(item.FullPath));
				writer = fileinfo.OpenWrite();
			}
			catch (Exception)
			{
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.CreateFile, item.FullPath, task.RemoteHost));
				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
				return;
			}
			//创建网络流
			NetworkStream netStream = null;
			try
			{
				netStream = client.GetStream();
			}
			catch (Exception)
			{
				OnNetworkError(new EventArgs());
				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
				return;
			}
			using (writer)
			{
				using (netStream)
				{
					//发送文件请求
					PackedNetworkMessage pnm = MessagePacker.BuildNetworkMessage(Message.Create(task.RemoteHost, task.RemoteHost.HostSub.Ipv4Address, Config.GetRandomTick(), Config.HostName, Config.HostUserName, Consts.Commands.GetFileData, 0ul, string.Format("{0:x}:{1:x}:{2}", task.PackageID, item.Index, item.CurrentFileTransfered), ""));
					if (!SendDataInBuffer(netStream, pnm.Data, pnm.Data.Length)) return;	//发送请求

					TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Processing);
					item.StartTime = DateTime.Now;

					byte[] buffer = new byte[SendBuffer];
					int length = buffer.Length;

					while (item.State != FileTaskItemState.Canceling && client.Connected && (length = ReceiveByBuffer(netStream, buffer, length)) > 0)
					{
						if (!WriteBufferToFile(task.RemoteHost, writer, item.FullPath, buffer, length)) return;
						item.CurrentFileTransfered += (ulong)length;
						item.FinishedSize += (ulong)length;

						//判断还有多少
						length = buffer.Length;
						ulong restLength = item.CurrentFileSize - item.CurrentFileTransfered;
						if (restLength < (ulong)length) length = (int)restLength;
					}
				}
			}

			//判断是否完成
			if (item.State == FileTaskItemState.Canceling) TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Canceled);
			else if (item.CurrentFileTransfered == item.CurrentFileSize) TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Finished);
			else TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
		}
Ejemplo n.º 11
0
		/// <summary>
		/// 创建 FileTaskEventArgs class 的新实例
		/// </summary>
		public FileTaskEventArgs(FileTaskInfo taskInfo, FileTaskItem taskItem)
		{
			TaskInfo = taskInfo;
			TaskItem = taskItem;
			IsHandled = false;
		}
Ejemplo n.º 12
0
		//传输文件
		bool ProcessFileTransfer(TcpClient client, NetworkStream netStream, FileTaskInfo task, FileTaskItem item, string currentDirectory, string fileName, ulong fileSize, bool updateTotal)
		{
			FileStream writer = null;
			string path = Path.Combine(currentDirectory, fileName);
			try
			{
				System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
				writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
			}
			catch (Exception)
			{
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.CreateFile, path, task.RemoteHost));
				TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
				return false;
			}
			//初始化传输参数
			item.CurrentFileSize = fileSize;
			item.CurrentFileTransfered = 0ul;
			item.CurrentName = fileName;
			if (updateTotal)
			{
				item.TotalSize += fileSize;
			}
			item.FileCount++;

			using (writer)
			{
				byte[] buffer = new byte[SendBuffer];
				int length = 0;

				int readlength = buffer.Length;
				if ((ulong)readlength > item.CurrentFileSize) readlength = (int)item.CurrentFileSize;
				while (item.State != FileTaskItemState.Canceling && client.Connected && item.CurrentFileTransfered < item.CurrentFileSize && (length = ReceiveByBuffer(netStream, buffer, readlength)) > 0)
				{
					if (!WriteBufferToFile(task.RemoteHost, writer, path, buffer, length)) break;
					item.CurrentFileTransfered += (ulong)length;
					item.FinishedSize += (ulong)length;

					readlength = buffer.Length;
					if ((ulong)readlength > item.CurrentFileSize - item.CurrentFileTransfered) readlength = (int)(item.CurrentFileSize - item.CurrentFileTransfered);
				}

				writer.Close();

				System.Diagnostics.Debug.Assert(item.CurrentFileTransfered <= item.CurrentFileSize, string.Format("传输文件异常。{0} 预计长度:{1} ,实际写入 {2}", item.CurrentName, item.CurrentFileSize, item.CurrentFileTransfered));

				if (item.CurrentFileTransfered < item.CurrentFileSize)
				{
					if (item.State != FileTaskItemState.Canceling)
					{
						TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
					}
					return false;
				}
				else
				{
					item.FinishedFileCount++;
					return true;
				}
			}
		}
Ejemplo n.º 13
0
		/// <summary>
		/// 开始接收文件任务
		/// </summary>
		/// <param name="task">任务信息</param>
		/// <param name="item">任务项目</param>
		internal void PerformFileReceive(FileTaskInfo task, FileTaskItem item)
		{
#if DEBUG
			System.Console.WriteLine("开始接受文件,尝试连接到 " + task.RemoteHost.HostSub.Ipv4Address.ToString());

#endif
			using (TcpClient client = new TcpClient())
			{
				client.ReceiveTimeout = this.Config.ConnectionTimeout;
				client.SendTimeout = this.Config.ConnectionTimeout;
				try
				{
					client.Connect(task.RemoteHost.HostSub.Ipv4Address);
				}
				catch (Exception)
				{
					this.TaskManager.MarkReceiveTaskItemState(item, FileTaskItemState.Failure);
					if (client.Connected) client.Close();
					return;
				}
				//检测是文件夹还是单个文件
				if (item.IsFolder)
				{
					PerformFileReceive_Folder(client, task, item);
				}
				else
				{
					PerformFileReceive_File(client, task, item);
				}
				client.Close();
			}
		}
Ejemplo n.º 14
0
		/// <summary>
		/// 发送单个文件
		/// </summary>
		/// <param name="client"></param>
		/// <param name="task"></param>
		/// <param name="item"></param>
		void PerformSendFile(TcpClient client, FileTaskInfo task, FileTaskItem item)
		{
			System.IO.FileStream fs = null;
			System.Net.Sockets.NetworkStream writer = null;
			try
			{
				writer = client.GetStream();
			}
			catch (Exception)
			{
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				return;
			}
			try
			{
				fs = new System.IO.FileStream(item.FullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
			}
			catch (Exception)
			{
				if (writer != null) writer.Close();
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.OpenFileToSend, item.FullPath, task.RemoteHost));

				return;
			}
			using (fs)
			{
				//检测断点数据是否正确
				if (item.CurrentFileTransfered < 0 || item.CurrentFileTransfered > (ulong)fs.Length) item.CurrentFileTransfered = 0;
				fs.Seek((long)item.CurrentFileTransfered, System.IO.SeekOrigin.Begin);

				//设置当前任务信息
				item.CurrentFileSize = (ulong)fs.Length;
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Processing);
				item.StartTime = DateTime.Now;

				using (writer)
				{
					byte[] buffer = new byte[SendBuffer];	//缓冲区

					while (item.CurrentFileTransfered < item.CurrentFileSize)
					{

						int bytesRead = fs.Read(buffer, 0, buffer.Length);
						try
						{
							writer.Write(buffer, 0, bytesRead);
						}
						catch (Exception)
						{
							TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
							break;
						}

						//更新进度
						item.CurrentFileTransfered += (ulong)bytesRead;
						item.FinishedSize += (ulong)bytesRead;
					}
					item.FinishedFileCount++;
					writer.Close();
				}
				fs.Close();
				//标记任务完成
				if (item.State != FileTaskItemState.Failure) TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Finished);
			}
		}
Ejemplo n.º 15
0
		//发送要求创建文件命令
		bool PerformSendDirectory_SendCreateDirCommand(string path, NetworkStream stream, FileTaskInfo task, FileTaskItem item)
		{
			string strCMD = string.Format(":{0}:{1}:{2:x}:", string.IsNullOrEmpty(path) ? "." : System.IO.Path.GetFileName(path), 0, (int)(string.IsNullOrEmpty(path) ? Consts.Cmd_FileType_Option.RetParent : Consts.Cmd_FileType_Option.Dir));

			byte[] bytes = null;
			if (task.RemoteHost.IsEnhancedContractEnabled) bytes = System.Text.Encoding.Unicode.GetBytes(strCMD);
			else bytes = System.Text.Encoding.Default.GetBytes(strCMD);

			if (!string.IsNullOrEmpty(path)) item.FinishedFolderCount++;

			try
			{
				stream.Write(System.Text.Encoding.Default.GetBytes((bytes.Length + 4).ToString("x4")), 0, 4);
				stream.Write(bytes, 0, bytes.Length);
				return true;
			}
			catch (Exception)
			{
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				return false;
			}
		}
Ejemplo n.º 16
0
		//发送文件夹中的文件
		bool PerformSendDirectory_SendFilesInDirectory(string path, NetworkStream stream, FileTaskInfo task, FileTaskItem item, bool updateTotal)
		{
			System.IO.FileInfo fileinfo = new System.IO.FileInfo(path);
			if (!fileinfo.Exists)
			{
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.OpenFileToSend, path, task.RemoteHost));
			}

			if (updateTotal) item.TotalSize += (ulong)fileinfo.Length;
			item.CurrentName = fileinfo.Name;
			item.CurrentFileTransfered = 0;
			item.CurrentFileSize = (ulong)fileinfo.Length;

			string strCMD = string.Format(":{0}:{1:x}:{2:x}:", fileinfo.Name, fileinfo.Length, (int)Consts.Cmd_FileType_Option.Regular);

			byte[] bytes = null;
			if (task.RemoteHost.IsEnhancedContractEnabled) bytes = System.Text.Encoding.Unicode.GetBytes(strCMD);
			else bytes = System.Text.Encoding.Default.GetBytes(strCMD);

			try
			{
				stream.Write(System.Text.Encoding.Default.GetBytes((bytes.Length + 4).ToString("x4")), 0, 4);
				stream.Write(bytes, 0, bytes.Length);
			}
			catch (Exception)
			{
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				return false;
			}

			//写入文件数据
			FileStream reader = null;
			try
			{
				reader = fileinfo.OpenRead();
			}
			catch (Exception)
			{
				OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.OpenFileToSend, path, task.RemoteHost));
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				return false;
			}

			using (reader)
			{
				byte[] buffer = new byte[SendBuffer];
				while (item.CurrentFileTransfered < (ulong)reader.Length)
				{
					int bytesRead = reader.Read(buffer, 0, buffer.Length);
					item.CurrentFileTransfered += (ulong)bytesRead;
					item.FinishedSize += (ulong)bytesRead;

					try
					{
						stream.Write(buffer, 0, bytesRead);
					}
					catch (Exception)
					{
						TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
						return false;
					}
				}
				reader.Close();
			}
			item.FinishedFileCount++;

			return true;
		}
Ejemplo n.º 17
0
		//发送文件夹
		void PerformSendDirectory(TcpClient client, FileTaskInfo task, FileTaskItem item)
		{
			NetworkStream stream = null;
			try
			{
				stream = client.GetStream();
			}
			catch (Exception)
			{
				TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
				return;
			}

			string currentDirectory = item.FullPath;			//当前处理路径
			Stack<string> directoryStack = new Stack<string>();	//文件夹栈
			directoryStack.Push("");

			bool needUpdateTotal = item.TotalSize == 0;		//是否需要在发送的时候更新统计
			TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Processing);
			item.StartTime = DateTime.Now;

			using (stream)
			{
				while (!string.IsNullOrEmpty(currentDirectory) || directoryStack.Count > 0)
				{
					if (!PerformSendDirectory_SendCreateDirCommand(currentDirectory, stream, task, item)) return;
					if (string.IsNullOrEmpty(currentDirectory))
					{
						if (directoryStack.Count > 0) currentDirectory = directoryStack.Pop();	//当前是空目录,则向上递归
						continue;
					}

					//扫描目录和文件
					string[] files = null, directories = null;
					try
					{
						files = System.IO.Directory.GetFiles(currentDirectory);
						directories = System.IO.Directory.GetDirectories(currentDirectory);

						item.FolderCount += directories.Length;
						item.FileCount += files.Length;
					}
					catch (Exception)
					{
						TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Failure);
						OnFileSystemOperationError(new FileSystemOperationErrorEventArgs(FileSystemOperationType.QueryDirectory, item.FullPath, task.RemoteHost));
						return;
					}

					//优先发送文件
					foreach (var f in files)
					{
						if (!PerformSendDirectory_SendFilesInDirectory(f, stream, task, item, needUpdateTotal)) return;
					}

					//扫描子目录
					if (directories.Length > 0)
					{
						directoryStack.Push("");
						Array.ForEach(directories, s => { directoryStack.Push(s); });
						currentDirectory = directoryStack.Pop();	//取出一个文件夹来发送
					}
					else
					{
						//如果没有子目录,则置空当前目录,以命令流程向上返回
						currentDirectory = null;
					}
				}
				if (item.State != FileTaskItemState.Failure) TaskManager.MarkSendTaskItemState(item, FileTaskItemState.Finished);
			}
		}