.NET Zone is brought to you in partnership with:

Ayobami is a software developer, trainer and consultant. He is from Ibadan, Nigeria, and he specializes in .NET technologies: C#, VB .NET, ASP.NET, as well as Lua, PHP, Android, VOIP and IP convergence technology. Ayobami is a DZone MVB and is not an employee of DZone and has posted 12 posts at DZone. You can read more from them at their website. View Full User Profile

How to: File Sharing Application in C#

06.06.2012
| 5259 views |
  • submit to reddit
This is a sequel to my blog post on "A Client Server File Sharing Application in C#" I have received several emails asking for the application to be made into a whole package instead of having it as a separate client and server applications. In order to save time and not to send the solution as email to people again, I have decided to make it a blog post and make the whole package available.

The application is written in C# and it will allow files to be sent from one computer to another on the network. It attempts to compile what both the client and server applications in my previous post- A Client Server File Sharing Application in C# do into a single project. To gain a full understanding of the workings, I recommend you read the following-
The full listing of the source code is below.
using System;;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FileSharingApp
{
    public partial class Form1 : Form
    {
        private static string shortFileName = "";
        private static string fileName = "";

         public delegate void FileRecievedEventHandler(object source, 

          string fileName);

        public event FileRecievedEventHandler NewFileRecieved;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.NewFileRecieved+=new FileRecievedEventHandler

            (Form1_NewFileRecieved);
        }

        private void Form1_NewFileRecieved(object sender, string 

         fileName)
        {
            this.BeginInvoke(
            new Action(
            delegate()
            {
                MessageBox.Show("New File Recieved\n"+fileName);
                System.Diagnostics.Process.Start("explorer", @"c:\");
            }));
        }

        private void btnListen_Click(object sender, EventArgs e)
        {
            int port = int.Parse(txtHost.Text);
            Task.Factory.StartNew(() => HandleIncomingFile(port));
            MessageBox.Show("Listening on port"+port);
        }

        public void HandleIncomingFile(int port)
        {
          try
            {
                TcpListener tcpListener = new TcpListener(port);
                tcpListener.Start();
                while (true)
                {
                  Socket handlerSocket = tcpListener.AcceptSocket();
                    if (handlerSocket.Connected)
                    {
                     string fileName = string.Empty;
                     NetworkStream networkStream = new NetworkStream

                      (handlerSocket);
                     int thisRead = 0;
                     int blockSize = 1024;
                     Byte[] dataByte = new Byte[blockSize];
                     lock (this)
                     {
                      string folderPath = @"c:\";
                      handlerSocket.Receive(dataByte);
                      int fileNameLen = BitConverter.ToInt32(dataByte,

                       0);
                      fileName = Encoding.ASCII.GetString(dataByte, 4, 

                       fileNameLen);
                      Stream fileStream = File.OpenWrite(folderPath + 

                       fileName);
                      fileStream.Write(dataByte, 4+fileNameLen,(

                       1024-(4+fileNameLen)));
                      while (true)
                      {
                       thisRead = networkStream.Read(dataByte, 0, 

                        blockSize);
                       fileStream.Write(dataByte, 0,thisRead);
                       if (thisRead == 0)
                        break;
                      }
                      fileStream.Close();

                    }
                    if (NewFileRecieved != null)
                     {
                       NewFileRecieved(this, fileName);
                     }
                    handlerSocket = null;
                    }
                }

            }
            catch
            {

            }
        }

         private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Title = "File Sharing Client";
            dlg.ShowDialog();
            txtFile.Text = dlg.FileName;
            fileName = dlg.FileName;
            shortFileName = dlg.SafeFileName;
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string ipAddress = txtIPAddress.Text;
            int port = int.Parse(txtPort.Text);
            string fileName = txtFile.Text;
            Task.Factory.StartNew(() => SendFile(ipAddress,port,

             fileName,shortFileName));
            MessageBox.Show("File Sent");
        }

        public void SendFile(string remoteHostIP, int remoteHostPort

           , string  longFileName, string shortFileName)
        {
         try
         {
          if(!string.IsNullOrEmpty(remoteHostIP)) 

          { 

            byte[] fileNameByte = Encoding.ASCII.GetBytes

             (shortFileName); byte[] fileData =

              File.ReadAllBytes(longFileName); 

             byte[] clientData
                 = new byte[4 + fileNameByte.Length 

                + fileData.Length]; 

             byte[] fileNameLen = BitConverter.GetBytes(

              fileNameByte.Length); 

             fileNameLen.CopyTo(clientData, 0); 

             fileNameByte.CopyTo(clientData,4);

             fileData.CopyTo(clientData, 4 + fileNameByte.Length);

            TcpClient clientSocket = new TcpClient(remoteHostIP,

           remoteHostPort);

             NetworkStream networkStream = clientSocket.GetStream(); 

          networkStream.Write(clientData,
                  0, clientData.GetLength

              (0)); networkStream.Close(); }
         }
         catch
         {

         }
        }
    }
}    

 The Complete source code of the application is available for download Here
Published at DZone with permission of Ayobami Adewole, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)