Получение всех списков каталогов / файлов FTP за один вызов

Я создаю программу резервного копирования, которая выполняет резервное копирование данных на FTP. Для эффективного архивирования мне нужно провести несколько сравнений атрибутов файлов. Сейчас я использую FluentFTP и называю FtpClient.FileExistsFtpClient.GetFileSize и FtpClient.GetModifiedTimeна файл. Это явно не очень оптимально.

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

Есть ли другой способ сделать это, кроме как развернуть собственное решение?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
2 451
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FTP предлагает следующие команды для получения информации об удаленных файлах:

  • NLST для получения имен файлов в определенном каталоге - Поддерживается серверами все.
  • SIZE и MDTM для получения размера и файла модификации определенного файла - Поддерживается практически всеми серверами.
  • LIST для получения списка каталогов, включая атрибуты файлов - Поддерживается серверами все, но список не стандартизирован и, следовательно, не может считаться машиночитаемым. Хотя большинство серверов будут поддерживать листинг в стиле * nix (например, команду * nix ls). Хотя у каждого будут свои причуды.
  • MLSD для получения списка каталогов, включая атрибуты файлов в машиночитаемом формате - эта команда менее всего поддерживается. Это особенно не поддерживается * nix vsftpd и Windows IIS.

Таким образом, вам не нужно использовать FtpClient.GetFileSize и FtpClient.GetModifiedTimeна файл. Используйте FtpClient.GetListingна каталог. Внутренне он использует MLSD, если поддерживается сервером. В противном случае он возвращается к LIST и пытается проанализировать листинг.


Некоторые FTP-серверы (например, ProFTPD) поддерживают нестандартный проприетарный переключатель -R на команду LIST, которая заставляет их возвращать список во всех подпапках. FluentFTP тоже поддерживает это (FtpListOption.Recursive). Однако обратите внимание, что FluentFTP использует -R только с LIST, в то время как он предпочитает использовать MLSD, если сервер поддерживает его. Итак, чтобы убедиться, что используется LIST -R, вам необходимо использовать как FtpListOption.Recursive, так и FtpListOption.ForceList.

Если ваш сервер не поддерживает переключатель -R, вам придется реализовать рекурсию самостоятельно. Или используйте FTP-клиент, у которого есть API.

Например, с мойСборка WinSCP .NET вы можете использовать Session.EnumerateRemoteFiles:

IEnumerable<RemoteFileInfo> allFiles =
    session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);

Другие вопросы по теме