Я пытаюсь загрузить большой файл из 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;
}
}