sftp_read скачет большие блоки байтов при чтении из файла

0

Я пытаюсь загрузить файл через sftp, и до сих пор я подключился к серверу через сеанс ssh, а затем открыл сеанс sftp, используя сеанс ssh, и все кажется прекрасным. Я открыл файл на сервере, и я использую sftp_read(), чтобы получить блок байтов из файла. Мой код:

char buffer[16384] = {};
ssize_t nbytes;
ssize_t ntotal = 0;
for (;;) {
    nbytes = sftp_read(file, buffer, sizeof(buffer));

    if (nbytes == 0) {
        break; // EOF
    }

    localFile << buffer;
    ntotal += nbytes;
    //sftp_seek(file, ntotal);
}

Но по какой-то причине, когда блоки считываются, первые 20 байтов верны, но 21-й и 16384-й байты ошибочны. Оказывается, после считывания 20 байтов, читатель переходит к 16384-му байту файла и продолжает читать, как ничего не произошло.

Я провел некоторое тестирование, и если бы я изменил буфер на любой размер, будь то 16384, 21, 22, 50 и т.д., Он все равно прыгнул на 16384-й байт после правильного чтения 20 байтов.

Для этого есть причина? Есть ли более эффективная библиотека, чем libssh и sftp, которые я могу использовать без ошибок?

  • 1
    вы не пишете в поток правильно, используйте localFile.write(buffer, nbytes)
  • 0
    Я использую std :: ofstream для записи в локальный файл. Я делал это раньше, чтобы синтаксис был в порядке.
Показать ещё 4 комментария
Теги:
ssh
sftp
libssh

1 ответ

-1
Лучший ответ

В конце концов, мне не нужно было использовать libssh. Для любого, кто хочет другой способ копирования файлов через sftp, просто используйте:

system("scp -i private_key [email protected]:directory_to_file/file.txt path_to_local_dir/file.txt");
  • 0
    Эй, чувак, просто еще одна проблема, которую я имею, не могли бы вы прислать мне фрагмент кода, который вы использовали для подключения к удаленному серверу

Ещё вопросы

Сообщество Overcoder
Наверх
Меню