Пример #1
0
 private void ReportUploadProgress(object sender, ProgressModel e)
 {
     if (UploadProgressList.Count > 0 && (UploadProgressList.Where(p => p.Filename.Equals(e.Filename)).ToList().Count > 0))
     {
         UploadProgressList.Where(p => p.Filename.Equals(e.Filename)).First().PctCompleted = e.PctCompleted;
     }
 }
Пример #2
0
        // Other methods

        // Initiate progress bar for file upload/download
        private void InitProgress(out ProgressModel progModel, out Progress <ProgressModel> progress, string filename, ActionType actionType)
        {
            lock (this)
            {
                progModel = new ProgressModel()
                {
                    PctCompleted = 0, Filename = filename
                };
                progress = new Progress <ProgressModel>();
                if (actionType == ActionType.Upload)
                {
                    AddOnUI(UploadProgressList, progModel);
                    progress.ProgressChanged += ReportUploadProgress;
                }
                else if (actionType == ActionType.Download)
                {
                    AddOnUI(DownloadProgressList, progModel);
                    progress.ProgressChanged += ReportDownloadProgress;
                }
            }
        }
Пример #3
0
        // Download a file from the shared drive
        private void DownloadFile(string fileToDownload, IProgress <ProgressModel> progress)
        {
            NetworkStream networkStream = null;
            FileStream    fileStream    = null;

            try
            {
                var report = new ProgressModel()
                {
                    PctCompleted = 0, Filename = fileToDownload
                };
                var socket = new TcpClient(ServerIPAddress, ServerPortNumber);
                networkStream = socket.GetStream();
                // Send request
                var request_bytes = BitConverter.GetBytes((int)RequestType.DownloadFile);
                networkStream.Write(request_bytes, 0, request_bytes.Length);
                // Create and send request header
                var clientHeader = new ClientDownloadFileHeader()
                {
                    Filename = fileToDownload
                };
                var clientHeaderBytes       = SerializationMethods.Serialize(clientHeader);
                var clientHeaderLengthBytes = BitConverter.GetBytes(clientHeaderBytes.Length);
                networkStream.Write(clientHeaderLengthBytes, 0, clientHeaderLengthBytes.Length);
                networkStream.Write(clientHeaderBytes, 0, clientHeaderBytes.Length);
                // Check server response
                var responseBytes = new byte[sizeof(int)];
                networkStream.Read(responseBytes, 0, responseBytes.Length);
                var response = BitConverter.ToInt32(responseBytes, 0);
                if (response == (int)ResponeType.Failure)
                {
                    throw new FileDownloadException();
                }
                // Receive server header
                var serverHeaderSizeBytes = new byte[sizeof(int)];
                networkStream.Read(serverHeaderSizeBytes, 0, serverHeaderSizeBytes.Length);
                var serverHeaderBytes = new byte[BitConverter.ToInt32(serverHeaderSizeBytes, 0)];
                networkStream.Read(serverHeaderBytes, 0, serverHeaderBytes.Length);
                var serverHeader        = (ServerDownloadFileHeader)SerializationMethods.Deserialize(serverHeaderBytes);
                var receivedBlockBuffer = new byte[BlockSize];
                fileStream = File.OpenWrite(DownloadDirectory + fileToDownload);
                int totalBytesRead = 0;
                var fileSize       = serverHeader.FileSize;
                while (totalBytesRead < fileSize)
                {
                    var buffer    = new byte[BlockSize];
                    var bytesRead = networkStream.Read(buffer, 0, buffer.Length);
                    totalBytesRead += bytesRead;
                    fileStream.Write(buffer, 0, bytesRead);
                    var bytesReadRatio = (double)totalBytesRead / serverHeader.FileSize;
                    report.PctCompleted = (int)(bytesReadRatio * 100);
                    progress.Report(report);
                }
            }
            catch (FileDownloadException)
            {
                MessageBox.Show("The requested file cannot be downloaded at this time");
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
                networkStream.Close();
            }
        }
Пример #4
0
 // Upload a file to the shared drive
 public void UploadFile(string fullPath, string filename, IProgress <ProgressModel> progress)
 {
     try
     {
         var report = new ProgressModel()
         {
             PctCompleted = 0, Filename = filename
         };
         var fileSize      = (int)new FileInfo(fullPath).Length;
         int numBlocks     = fileSize / BlockSize;
         int lastBlockSize = fileSize % BlockSize;
         // Header to be sent to the server
         var fileHeader = new ClientUploadFileHeader()
         {
             Filename      = filename,
             FileSize      = fileSize,
             NumBlocks     = numBlocks,
             LastBlockSize = lastBlockSize
         };
         // Connect to server
         var clientSocket  = new TcpClient(ServerIPAddress, ServerPortNumber);
         var networkStream = clientSocket.GetStream();
         // Convert data to byte arrays, then write to network stream
         var uploadRequestBytes = BitConverter.GetBytes((int)RequestType.UploadFile);
         var headerBytes        = SerializationMethods.Serialize(fileHeader);
         var headerLenBytes     = BitConverter.GetBytes(headerBytes.Length);
         networkStream.Write(uploadRequestBytes, 0, uploadRequestBytes.Length);
         networkStream.Write(headerLenBytes, 0, headerLenBytes.Length);
         networkStream.Write(headerBytes, 0, headerBytes.Length);
         var fstream = File.OpenRead(fullPath);
         for (int i = 0; i < numBlocks; i++)
         {
             var file_data = new byte[BlockSize];
             fstream.Seek(i * BlockSize, SeekOrigin.Begin);
             fstream.Read(file_data, 0, file_data.Length);
             networkStream.Write(file_data, 0, file_data.Length);
             report.PctCompleted = (i + 1) * 100 / numBlocks;
             progress.Report(report);
         }
         if (lastBlockSize > 0)
         {
             var file_data = new byte[lastBlockSize];
             fstream.Seek(numBlocks * BlockSize, SeekOrigin.Begin);
             fstream.Read(file_data, 0, file_data.Length);
             networkStream.Write(file_data, 0, file_data.Length);
         }
         fstream.Dispose();
         // Check if upload was successful
         var responeBuffer = new byte[sizeof(int)];
         var read          = networkStream.Read(responeBuffer, 0, responeBuffer.Length);
         var responseType  = BitConverter.ToInt32(responeBuffer, 0);
         if (responseType == (int)ResponeType.Failure)
         {
             throw new Exception("Error uploading file, try again");
         }
         networkStream.Close();
         RefreshList();
     }
     catch (Exception e)
     {
         MessageBox.Show(e.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
     }
 }