Скачать большой файл, используя libssh2 - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь загрузить большой файл из SFTP. Размер файла составляет около 7600 КБ. Я использую libssh2, но время загрузки заняло не менее 11 минут. 11 минут не приемлемо в соответствии с нашим клиентом. Как я могу уменьшить время загрузки хотя бы на 5 минут? Любая помощь будет оценена.

Ниже мой код:

#define MAX_SFTP_READ_SIZE 65535

getFilesFromServer(string directory)
{
    vector<string> filesFromServer;
    vector<string> stringItems;
    string tempString;
    int returnValue;
    char buffer[MAX_SFTP_READ_SIZE], longEntry[MAX_SFTP_READ_SIZE];

    try
    {
        filesFromServer.clear();

        if (!establishConnection(false))
            return filesFromServer;

        LIBSSH2_SFTP_ATTRIBUTES attributes;

        returnValue = 0;

        returnValue = libssh2_sftp_stat(sftpSession_, sirectory.c_str(), &attributes);

        if (returnValue < 0)
            return filesFromServer;

        sftpHandle_ = libssh2_sftp_opendir(sftpSession_, directory.c_str());

        if (sftpHandle_ == NULL || !sftpHandle_)
            return filesFromServer;

        do
        {
            memset(buffer, 0x00, MAX_SFTP_READ_SIZE);
            memset(longEntry, 0x00, MAX_SFTP_READ_SIZE);
            sTempString = "";

            returnValue = libssh2_sftp_readdir_ex(sftpHandle_, buffer, MAX_SFTP_READ_SIZE, longEntry, MAX_SFTP_READ_SIZE, &attributes);

            if (returnValue > 0)
            {
                if (longEntry[0] != '\0')
                {
                    // some code here
                }
            }
            else
            {
                break;
            }
        } while (true);

        if (filesFromServer.size() > 1)
            sort(filesFromServer.begin(), filesFromServer.end());       

        terminateConnection(true);

        return filesFromServer;
    }
    catch (...)
    {
        filesFromServer.clear();
        return filesFromServer;
    }
}


downloadFile(string sourceFile)
{
    FILE *file = NULL;
    size_t dataRead = 0;
    size_t dataWritten;
    char data[MAX_SFTP_READ_SIZE];
    string destinationFile;

    try
    {
        destinationFile = fileInformation_.destinationDirectory + fileInformation_.filenames[0];

        sftpHandle_ = libssh2_sftp_open_ex(sftpSession_, sourceFile.c_str(), sourceFile.length(), LIBSSH2_FXF_READ, 0, LIBSSH2_SFTP_OPENFILE);

        if (!sftpHandle_)
        {
            return false;
        }

        file = fopen(destinationFile.c_str(), "wb");

        if (file == NULL)
        {
            return false;
        }

        do
        {
            memset (data, 0x00, MAX_SFTP_READ_SIZE);
            dataRead = libssh2_sftp_read(sftpHandle_, data, sizeof(data));

            if (dataRead > 0)
            {
                ::write(2, data, dataRead);
                dataWritten = fwrite(data, 1, dataRead, file);

                if (dataRead != dataWritten)
                {
                    fclose(file);
                    close();
                    return false;
                }
            }
            else
                break;

        } while (1);

        fclose(file);
        close();

        return true;
    }
    catch (...)
    {
        try
        {
            if (file != NULL)
                fclose(file);

            close();
        }
        catch (...) { }

        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...