Пересылка файла через сокет - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Перейду сразу к делу - в нете полно примеров как пересылать файл с одной папки в другою через сокеты, но там один файл и все как-то просто. У меня задача посложнее: есть две папки, C:/server. C:/client ии я должен переслать все файлы с одной папки в другую, и наоборот (а если такой файл уже есть,то сравнить по дате какой файл позже сделан и его переместить вместо нового) (хотя этот пункт необязательно, мне бы просто переслать все файлы) Можно назвать это как файловый синхронизатор от одной папки на другую через сокет. Что я только не перепробовал, все равно не получается, вот надеюсь на добрую душу которая поможет, ибо я в отчаянье.

Решение задачи: «Пересылка файла через сокет»

textual
Листинг программы
class Client
    {
 
        private static string _serverPath = "C:/Socket/Server/";
        private static string _clientPath = "C:/Socket/Client/";
        private static Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       
        static void Main(string[] args)
        {
            Console.Title = "Client";
            Connect();
            TransferFiles();
            Console.ReadLine();
        }
 
        
        private static void TransferFiles()
        {
            try
            {
                if (!Directory.Exists(_clientPath) || !Directory.Exists(_serverPath))
                {
                    ConsoleColor c = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(@"Create C:\Socket\Server and/or C:\Socket\client DIRECTORY!");
                    Console.ForegroundColor = c;
                }
                else if (!Directory.EnumerateFileSystemEntries(_serverPath).Any() && !Directory.EnumerateFileSystemEntries(_clientPath).Any())
                {
                    ConsoleColor c = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(@"Directories are empty!");
                    Console.ForegroundColor = c;
                }
                else
                {
                    while (true)
                    {
                        DirectoryInfo dir_server = new DirectoryInfo(_serverPath);
                        foreach (var tempFile in dir_server.GetFiles())
                        {
                            string _fileName = tempFile.Name;
                            byte[] buffer;
                            if (!(File.Exists(_clientPath + _fileName)))
                            {
                                Console.WriteLine("\tReceiving file: " + _fileName);
                                buffer = Encoding.ASCII.GetBytes(_fileName);
                                _clientSocket.Send(buffer);
 
                                byte[] receivedBuf = new byte[1024];
                                int rec = _clientSocket.Receive(receivedBuf);
                                byte[] data = new byte[rec];
                                Array.Copy(receivedBuf, data, rec);
 
                                string result = Encoding.ASCII.GetString(data);
                                ConsoleColor c = Console.ForegroundColor;
                                Console.ForegroundColor = ConsoleColor.DarkCyan;
                                Console.WriteLine("\t\t" + result + "\n");
                                Console.ForegroundColor = c;
                            }
                        }
 
                        DirectoryInfo dir_client = new DirectoryInfo(_clientPath);
 
                        foreach (var tempFile in dir_client.GetFiles())
                        {
                            string _fileName = tempFile.Name;
                            byte[] buffer;
                            if (!(File.Exists(_serverPath + _fileName)))
                            {
                                Console.WriteLine("\tSending file: " + _fileName);
 
                                buffer = Encoding.ASCII.GetBytes(_fileName);
                                _clientSocket.Send(buffer);
 
                                byte[] receivedBuf = new byte[1024];
                                int rec = _clientSocket.Receive(receivedBuf);
                                byte[] data = new byte[rec];
                                Array.Copy(receivedBuf, data, rec);
 
                                string result = Encoding.ASCII.GetString(data);
                                ConsoleColor c = Console.ForegroundColor;
                                Console.ForegroundColor = ConsoleColor.DarkCyan;
                                Console.WriteLine("\t\t" + result + "\n");
                                Console.ForegroundColor = c;
                            }
                            else //salidzina faila saturu
                            {
 
                                DirectoryInfo compare = new DirectoryInfo(_serverPath);
                                foreach (var temp in compare.GetFiles())
                                {
                                    if (_fileName == temp.Name)
                                    {
                                        Console.WriteLine();
                                        DateTime client_file_time = File.GetLastWriteTime(_clientPath + _fileName);
                                        DateTime server_file_time = File.GetLastWriteTime(_serverPath + temp.Name);
 
                                        ConsoleColor c = Console.ForegroundColor;
 
                                        //clienta faila laika izvads:
                                        Console.WriteLine("\n-----------------------------------------------------");
                                        Console.ForegroundColor = ConsoleColor.Magenta;
                                        Console.WriteLine("   There is equal files with name: " + _fileName);
                                        Console.ForegroundColor = c;
                                        Console.WriteLine("-----------------------------------------------------");
                                        Console.Write("Client File name: ");
                                        Console.ForegroundColor = ConsoleColor.Yellow;
                                        Console.Write("\n" + _fileName);
                                        Console.ForegroundColor = c;
                                        Console.Write("\n" + "and it's creation time: ");
                                        Console.ForegroundColor = ConsoleColor.Blue;
                                        Console.Write(client_file_time);
                                        Console.ForegroundColor = c;
 
                                        //servera faila laika izvads
                                        Console.Write("\n\nServer File name: ");
                                        Console.ForegroundColor = ConsoleColor.Yellow;
                                        Console.Write("\n" + temp.Name);
                                        Console.ForegroundColor = c;
                                        Console.Write("\n" + "and it's creation time: ");
                                        Console.ForegroundColor = ConsoleColor.Blue;
                                        Console.Write(server_file_time);
                                        Console.ForegroundColor = c;
 
 
                                        Console.ForegroundColor = ConsoleColor.Cyan;
                                        if (server_file_time > client_file_time)
                                        {
                                            Console.WriteLine("\n\n\t\tServer file is older!");
                                            File.Delete(_clientPath + _fileName);
                                            File.Copy(_serverPath + temp.Name, _clientPath + _fileName);
                                            Console.ForegroundColor = ConsoleColor.Green;
                                            Console.WriteLine("\n\tThe newest File has been replaced!");
                                        }
                                        else if (server_file_time == client_file_time)
                                        {
                                            Console.WriteLine("\n\n\t\tServer and Client files are equal");
                                        }
                                        else
                                        {
                                            Console.WriteLine("\n\n\t\tClient file is older");
                                            File.Delete(_serverPath + temp.Name);
                                            File.Copy(_clientPath + _fileName, _serverPath + temp.Name);
                                            Console.ForegroundColor = ConsoleColor.Green;
                                            Console.WriteLine("\n\tThe newest File has been replaced!");
                                        }
                                        Console.ForegroundColor = c;
                                        Console.WriteLine("\n-----------------------------------------------------\n");
                                    }
                                }
                                //Thread.Sleep(TimeSpan.FromMinutes(1)); //minutes intervals
                                Thread.Sleep(TimeSpan.FromSeconds(10)); //10 sekundes intervals
                            }//else
                        }
                    }//while(true)
                }
            }
            catch (SocketException ex)
            {
                Console.Clear();
                Console.WriteLine("\n\n\t\t\t\t    Server is closed!");
                System.Environment.Exit(1);
            }
        }
 
        private static void Connect()
        {
            int attempts = 0;
            while (!_clientSocket.Connected)
            {
                try
                {
                    attempts++;
                    _clientSocket.Connect(IPAddress.Loopback, 100);
                }   
                catch (SocketException ex)
                {
                    Console.Clear();
                    Console.WriteLine("\n\t\t\t     Connection attempts: " + attempts.ToString());
                }
            }
            Console.Clear();
            ConsoleColor c = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            Console.WriteLine();
            Console.WriteLine("\t\t\t\tRaimonds Friidenbergs");
            Console.WriteLine("\t\t\t\t\t3. kurss");
            Console.WriteLine("\t\t\t\t\t  IT");
            Console.WriteLine("\t\t   --------------------------------------------------");
            Console.ForegroundColor = c;
            Console.WriteLine("\n\t\t\t\tConnected successfuly!\n");
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы