Загрузка...

Im writing software and need some advice.

Thread in C# created by CLS Dec 19, 2023. 442 views

  1. CLS
    CLS Topic starter Dec 19, 2023
    Есть некое ПО которое должно допустим раз в 5 минут стучатся к компам в локальной сети и перемещать все файлы из определенной папки в "Родительский" ПК где этот софт запущен, как лучше это сделать?
     
  2. ChatGPT
    ChatGPT Dec 19, 2023 2,246 Mar 14, 2023
    avatarCLS

    Для реализации данной задачи вам понадобится использовать сетевое взаимодействие между компьютерами в локальной сети и операции с файлами.

    Вот примерный алгоритм решения:

    1. На "Родительском" компьютере запустите сервер, который будет принимать запросы от других компьютеров и принимать файлы.
    2. На каждом компьютере в локальной сети запустите клиентскую программу, которая будет стучаться к серверу каждые 5 минут.
    3. Клиентская программа должна сканировать определенную папку на компьютере и отправлять файлы на сервер.
    4. Сервер должен принимать файлы от клиентов и сохранять их в "Родительскую" папку.

    Для реализации сетевого взаимодействия вы можете использовать сокеты или HTTP протокол. Для операций с файлами вам понадобятся функции для сканирования папки и перемещения файлов.

    Вот примерный код на C# для сервера:

    CSHARP

    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;

    class Server
    {
    static void Main()
    {
    // Установка IP-адреса и порта сервера
    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    int port = 12345;

    // Создание TCP Listener
    TcpListener listener = new TcpListener(ipAddress, port);
    listener.Start();

    Console.WriteLine("Сервер запущен. Ожидание подключений...");

    while (true)
    {
    // Принятие клиентского подключения
    TcpClient client = listener.AcceptTcpClient();
    Console.WriteLine("Подключение от клиента: " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString());

    // Получение потока для чтения данных от клиента
    NetworkStream stream = client.GetStream();

    // Получение имени файла от клиента
    byte[] fileNameBytes = new byte[1024];
    int bytesRead = stream.Read(fileNameBytes, 0, fileNameBytes.Length);
    string fileName = Encoding.ASCII.GetString(fileNameBytes, 0, bytesRead);

    // Получение данных файла от клиента
    byte[] fileData = new byte[1024];
    using (MemoryStream ms = new MemoryStream())
    {
    int bytesReceived;
    while ((bytesReceived = stream.Read(fileData, 0, fileData.Length)) > 0)
    {
    ms.Write(fileData, 0, bytesReceived);
    }

    // Сохранение файла в "Родительскую" папку
    string parentFolder = @"C:\ParentFolder";
    string filePath = Path.Combine(parentFolder, fileName);
    File.WriteAllBytes(filePath, ms.ToArray());
    }

    // Закрытие подключения
    client.Close();
    }
    }
    }
    Вот примерный код на C# для клиента:

    CSHARP

    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;

    class Client
    {
    static void Main()
    {
    // Установка IP-адреса и порта сервера
    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    int port = 12345;

    while (true)
    {
    try
    {
    // Создание TCP клиента
    TcpClient client = new TcpClient();

    // Подключение к серверу
    client.Connect(ipAddress, port);
    Console.WriteLine("Подключение к серверу успешно.");

    // Получение папки для сканирования
    string folderPath = @"C:\FolderToScan";

    // Сканирование папки и отправка файлов на сервер
    foreach (string filePath in Directory.GetFiles(folderPath))
    {
    string fileName = Path.GetFileName(filePath);

    // Отправка имени файла на сервер
    NetworkStream stream = client.GetStream();
    byte[] fileNameBytes = Encoding.ASCII.GetBytes(fileName);
    stream.Write(fileNameBytes, 0, fileNameBytes.Length);

    // Отправка данных файла на сервер
    byte[] fileData = File.ReadAllBytes(filePath);
    stream.Write(fileData, 0, fileData.Length);
    }

    // Закрытие подключения
    client.Close();
    }
    catch (Exception ex)
    {
    Console.WriteLine("Ошибка: " + ex.Message);
    }

    // Ожидание 5 минут перед следующей отправкой
    Thread.Sleep(5 * 60 * 1000);
    }
    }
    }
    Обратите внимание, что это только примерный код, и вам может потребоваться внести изменения в зависимости от ваших требований и окружения. Также не забудьте добавить обработку исключений и проверки наличия папок и файлов.

    Надеюсь, это поможет вам начать реализацию вашего ПО. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
     
    1. CLS Topic starter
      avatarChatGPT, можно как то обойтись без клиентского кода?
    2. ChatGPT
      avatarCLS

      Если вы хотите обойтись без клиентского кода на каждом компьютере в локальной сети, то можно использовать другой подход.

      Вы можете настроить "Родительский" компьютер как сетевой файловый сервер, например, с помощью протокола SMB (Server Message Block). Затем на каждом компьютере в локальной сети настроить автоматическое копирование файлов из определенной папки на "Дочерних" компьютерах на сетевой файловый сервер.

      Вот примерный алгоритм решения:

      1. На "Родительском" компьютере настройте сетевой файловый сервер, например, с помощью протокола SMB.
      2. На каждом "Дочернем" компьютере настройте автоматическое копирование файлов из определенной папки на сетевой файловый сервер.
      3. Установите расписание для автоматического копирования файлов каждые 5 минут.

      Вот примерный код на C# для копирования файлов на "Дочернем" компьютере:

      CSHARP

      using System;
      using System.IO;

      class Program
      {
      static void Main()
      {
      string sourceFolder = @"C:\FolderToCopy";
      string destinationFolder = @"\\ParentComputer\SharedFolder";

      try
      {
      // Копирование файлов из исходной папки в папку назначения
      foreach (string filePath in Directory.GetFiles(sourceFolder))
      {
      string fileName = Path.GetFileName(filePath);
      string destinationPath = Path.Combine(destinationFolder, fileName);
      File.Copy(filePath, destinationPath, true);
      }

      Console.WriteLine("Файлы успешно скопированы.");
      }
      catch (Exception ex)
      {
      Console.WriteLine("Ошибка: " + ex.Message);
      }
      }
      }
      В этом примере мы используем метод `File.Copy` для копирования файлов из исходной папки в папку назначения на сетевом файловом сервере. Установите эту программу на каждом "Дочернем" компьютере и настройте расписание для ее запуска каждые 5 минут.

      Обратите внимание, что для использования сетевого файлового сервера вам может потребоваться настроить соответствующие разрешения доступа и настройки безопасности.

      Надеюсь, это поможет вам реализовать вашу задачу без клиентского кода на каждом компьютере. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
    3. CLS Topic starter
      avatarChatGPT, Могу ли я с помощью метода File.Move() переместить файлы из удаленного компьютера на локальный
    4. View the next comments (1)
  3. Арбузим
    Попробуй сделать лог лист что бы видеть когда и какой файл отправился на "родительский" комп
     
    1. View previous comments (1)
    2. Арбузим
      avatarCLS , ну можно сделать что бы он отправлял их на файлообменник и ты получал ссылку на него в телеграмм например
    3. CLS Topic starter
      avatarАрбузим, уффф, жестко братан) Я думал что то с FTP придумать. Но это мне не подходит так как условно я не могу на клиентах ничего менять
    4. Арбузим
      avatarCLS , Можно открыть сокет на "Родительском" ПК, к которому будут подключаться остальные пк.
      И на этот сервер они будут раз 5 минут отправлять файлы
  4. Babryham
    Babryham Dec 28, 2023 Xyi 921 May 30, 2020
    если тебе нужно шариться по другим компам и перемещять в них файлы, если на них открыт smb, то юзай либу для smb думаю без меня найдешь
     
  5. D1STR1CT
    Есть вариант сделать PubSub на указанную папку и делать что нужно через ивенты.

    CSHARP
    using System;
    using System.IO;

    public class FolderWatcher
    {
    private FileSystemWatcher watcher;

    // Ивенты на каждое событие в папке
    public event EventHandler<string> FileCreated;
    public event EventHandler<string> FileDeleted;
    public event EventHandler<string> FileModified;
    public event EventHandler<string> FileRenamed;

    public FolderWatcher(string folderPath)
    {
    watcher = new FileSystemWatcher();
    watcher.Path = folderPath;
    watcher.EnableRaisingEvents = true;

    watcher.Created += (sender, e) => FileCreated?.Invoke(this, e.FullPath);
    watcher.Deleted += (sender, e) => FileDeleted?.Invoke(this, e.FullPath);
    watcher.Changed += (sender, e) => FileModified?.Invoke(this, e.FullPath);
    watcher.Renamed += (sender, e) => FileRenamed?.Invoke(this, e.FullPath);
    }
    }

    // Example usage:
    class Program
    {
    static void Main(string[] args)
    {
    //Путь к папке
    string folderPath = @"C:\Folder";
    var folderWatcher = new FolderWatcher(folderPath);

    //Добавление функционала (лямбда-выражения)
    folderWatcher.FileCreated += (sender, filePath) => Console.WriteLine($"Файл создан: {filePath}");
    folderWatcher.FileDeleted += (sender, filePath) => Console.WriteLine($"Файл удален: {filePath}");
    folderWatcher.FileModified += (sender, filePath) => Console.WriteLine($"Файл изменен: {filePath}");
    folderWatcher.FileRenamed += (sender, filePath) => Console.WriteLine($"Файл переименован: {filePath}");

    Console.WriteLine("Ожидание изменений...");
    Console.ReadLine();
    }
    }
     
    1. Babryham
      avatarD1STR1CT, ха только сегодня юзал для создания кода файлового менеджера
Loading...