/// <summary> /// получение запрашиваемых директорий с сервера /// </summary> /// <param name="netStream"></param> /// <param name="directory"></param> /// <returns></returns> private DirectoryContent GetDirectoriesFromServer(NetworkStream netStream, string directory) { try { //создание запроса на получение директорий GetDirectoryContentTask getDirectoryContentTask = new GetDirectoryContentTask(); //установка запросу, что нужно получить именно директории getDirectoryContentTask.Directory = directory; //отправка запроса к серверу netStream.Send(getDirectoryContentTask); //прочитать из потока Stream stream = netStream.WriteToStream(); //получить запрошенную информацию о директории DirectoryContent directoryInfoClass = Serializer.Deserialize <DirectoryContent>(((MemoryStream)stream).ToArray()); //вернуть сведения о директории return(directoryInfoClass); } catch (Exception ex) { MessageBox.Show(ex.Message); } return(null); }
/// <summary> /// обсуживание сервера /// </summary> /// <param name="client">новый клиент</param> public void Service(TcpClient client) { try { //пока клиент подключен using (TcpClient newClient = client) { while (true) { //получить сетевой поток клиента NetworkStream networkStream = newClient.GetStream(); //получить запрос клиента MemoryStream taskStream = (MemoryStream)networkStream.WriteToStream(); //если запроса не было if (taskStream.Length == 0) { break;//прервать операцию } //если запрос являлся получение сведений о директории if (this.IsTask <GetDirectoryContentTask>(taskStream)) { //десерилизовать запрос GetDirectoryContentTask task = Serializer.Deserialize <GetDirectoryContentTask>(taskStream.ToArray()); //отправить директории клиенту this.SendDirectoryDataToClient(task, networkStream); } //иначе, если запрос был на получение дисков else if (this.IsTask <GetDrivesTask>(taskStream)) { //отправить диски клиенту this.SendDrivesInfo(networkStream); } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// отправка полученных директорий и файлов в поток к клиенту /// </summary> /// <param name="task">запрос на получение директорий</param> /// <param name="networkStream">сетевой поток клиента</param> private void SendDirectoryDataToClient(GetDirectoryContentTask task, NetworkStream networkStream) { try { //получение коллекцию директорий по запросу List <DirectoryInfo> directories = this.GetDirectories(task.Directory); //создание нового экземпляра для сведений о директории DirectoryContent directoryContent = new DirectoryContent(); //проход по каждой директории в коллекции директорий foreach (var dir in directories) { //проверка, если файл имеет флаг директории и не является if (dir.Attributes.HasFlag(FileAttributes.Directory) && !dir.Attributes.HasFlag(FileAttributes.Hidden) &&//скрытым !dir.Attributes.HasFlag(FileAttributes.System) &&//системным !dir.Attributes.HasFlag(FileAttributes.Temporary)) //временным { //создать Data Object Model директории DirectoryMetadata directoryMetadata = new DirectoryMetadata() { FullPath = dir.FullName, Name = dir.Name, LastChanged = dir.LastWriteTime, }; //добавление в лист сведений о директории directoryContent.Directories.Add(directoryMetadata); } } //получение коллекции файлов List <FileInfo> files = this.GetFiles(task.Directory); //прохождение по каждому файлу в коллекции файлов foreach (var file in files) { //если файл не является if (!file.Attributes.HasFlag(FileAttributes.Hidden) &&//скрытым !file.Attributes.HasFlag(FileAttributes.System) &&//системным !file.Attributes.HasFlag(FileAttributes.Temporary)) //временным { //создать Data Object Model файла DirectoryMetadata fileMetadata = new DirectoryMetadata() { FullPath = file.FullName, Name = file.Name, LastChanged = file.LastWriteTime, }; //добавление в лист сведений о файле directoryContent.Files.Add(fileMetadata); } } //отправка клиенту запроса файлов и директорий networkStream.Send(directoryContent); } catch (UnauthorizedAccessException) { } catch (Exception ex) { MessageBox.Show(ex.Message); } }