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





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);