Пересылка файла через сокет - 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");
}
}