public void Execute(DownloadCommand command)
        {
            if (Connection == null)
            {
                Console.WriteLine("There is no connection to server!");

                return;
            }

            var localFileName = $"Resources{Path.DirectorySeparatorChar}{command.FileName}";

            var fileInfo   = new FileInfo(localFileName);
            var fileLength = fileInfo.Exists ? fileInfo.Length : 0;

            var message = new FileInfoCommand()
            {
                CommandType = CommandType.DownloadFileRequest,
                ClientId    = ClientId,
                FileName    = command.FileName,
                IsExist     = fileInfo.Exists,
                Size        = fileLength
            };

            Connection.Send(message);

            var serverFileInfoResponse = Connection.Receive().Deserialize <FileInfoCommand>();

            if (serverFileInfoResponse.FileName == null)
            {
                Console.WriteLine("File not found!");
                return;
            }

            var stopwatch = new Stopwatch();

            stopwatch.Restart();
            Connection.Send(serverFileInfoResponse);

            var bytesReceived = 0;

            using (var fileStream = File.OpenWrite(localFileName))
                using (var binaryWriter = new BinaryWriter(fileStream))
                {
                    binaryWriter.BaseStream.Seek(0, SeekOrigin.End);

                    while (bytesReceived < serverFileInfoResponse.Size - fileLength)
                    {
                        var filePart = Connection.Receive();

                        binaryWriter.Write(filePart);
                        binaryWriter.Flush();

                        bytesReceived += filePart.Length;
                    }
                }

            stopwatch.Stop();
            Console.WriteLine($"File successfully downloaded! " +
                              $"Average upload speed is {((double)bytesReceived / (1024 * 1024)) / (((double)stopwatch.ElapsedMilliseconds + 1) / 1000)} Mbps.");
        }
        public void Visit(FileInfoCommand command)
        {
            Visit((ICommand)command);

            if (Root.TryFindNode(command.Id, out var node) &&
                node is File file)
            {
                Message = $"ID={file.Id} Name={file.Name} Size={file.Size}";
            }
            else
            {
                OnFileDoesNotExist(command.Id);
            }
        }
Exemple #3
0
        public async Task Handle(Command command)
        {
            var fileCommand = command as FileInfoCommand;

            if (!Directory.Exists($"Resources{Path.DirectorySeparatorChar}{fileCommand.ClientId}"))
            {
                Directory.CreateDirectory($"Resources{Path.DirectorySeparatorChar}{fileCommand.ClientId}");
            }
            var localFileName = $"Resources{Path.DirectorySeparatorChar}{fileCommand.ClientId}{Path.DirectorySeparatorChar}{fileCommand.FileName}";

            var fileInfo   = new FileInfo(localFileName);
            var fileLength = fileInfo.Exists ? fileInfo.Length : 0;

            var serverFileInfoResponse = new FileInfoCommand()
            {
                CommandType = CommandType.UploadFileResponse,
                FileName    = fileCommand.FileName,
                IsExist     = fileInfo.Exists,
                Size        = fileLength
            };

            await _transportHandler.Send(serverFileInfoResponse.Serialize());

            await using (var fileStream = File.OpenWrite(localFileName))
                await using (var binaryWriter = new BinaryWriter(fileStream))
                {
                    binaryWriter.BaseStream.Seek(0, SeekOrigin.End);

                    var bytesReceived = 0;
                    while (bytesReceived < fileCommand.Size - fileLength)
                    {
                        var filePart = await _transportHandler.Receive();

                        binaryWriter.Write(filePart);
                        binaryWriter.Flush();

                        bytesReceived += filePart.Length;
                    }
                }

            var response = new Command()
            {
                CommandType = CommandType.UploadFileResponse
            };

            await _transportHandler.Send(response.Serialize());
        }
        public void Execute(UploadCommand command)
        {
            if (Connection == null)
            {
                Console.WriteLine("There is no connection to server!");

                return;
            }

            var localFileName = $"Resources{Path.DirectorySeparatorChar}{command.FileName}";
            var fileInfo      = new FileInfo(localFileName);

            if (!File.Exists(localFileName))
            {
                Console.WriteLine("File not found!");

                return;
            }

            var message = new FileInfoCommand()
            {
                CommandType = CommandType.UploadFileRequest,
                ClientId    = ClientId,
                FileName    = command.FileName,
                Size        = fileInfo.Length,
                IsExist     = true
            };

            Connection.Send(message);
            var serverFileInfoResponse = Connection.Receive().Deserialize <FileInfoCommand>();


            var bytes = File.ReadAllBytes(localFileName).Skip((int)serverFileInfoResponse.Size).ToArray();

            var stopwatch = new Stopwatch();

            stopwatch.Restart();

            Connection.Send(bytes);

            Connection.Receive().Deserialize <Commands.Command>();
            stopwatch.Stop();

            Console.WriteLine($"File uploaded successfully! " +
                              $"Average upload speed is {((double)bytes.Length / (1024 * 1024)) / (((double)stopwatch.ElapsedMilliseconds + 1) / 1000)} Mbps.");
        }
        public async Task Handle(Command command)
        {
            var fileCommand = command as FileInfoCommand;

            var serverRootFileName = $"Resources{Path.DirectorySeparatorChar}{fileCommand.FileName}";

            if (!Directory.Exists($"Resources{Path.DirectorySeparatorChar}{fileCommand.ClientId}"))
            {
                Directory.CreateDirectory($"Resources{Path.DirectorySeparatorChar}{command.ClientId}");
            }
            var userFolderFileName = $"Resources{Path.DirectorySeparatorChar}{fileCommand.ClientId}{Path.DirectorySeparatorChar}{fileCommand.FileName}";
            var localFileName      = File.Exists(userFolderFileName) ? userFolderFileName : serverRootFileName;

            if (!File.Exists(localFileName))
            {
                var fileNotFoundResponse = new FileInfoCommand()
                {
                    CommandType = CommandType.DownloadFileResponse
                };
                await _transportHandler.Send(fileNotFoundResponse.Serialize());

                return;
            }

            var fileInfo = new FileInfo(localFileName);
            var response = new FileInfoCommand()
            {
                CommandType = CommandType.DownloadFileResponse,
                FileName    = fileCommand.FileName,
                IsExist     = fileInfo.Exists,
                Size        = fileInfo.Length
            };

            await _transportHandler.Send(response.Serialize());

            (await _transportHandler.Receive()).Deserialize <FileInfoCommand>();

            var bytes = File.ReadAllBytes(localFileName).Skip((int)fileCommand.Size).ToArray();

            await _transportHandler.Send(bytes);
        }
Exemple #6
0
 public void Visit(FileInfoCommand command)
 {
 }